任何人都有一个不错的例子,最好是实用/有用,他们可以发布演示这个概念吗?
我在某个地方找到了我无法找到的这个术语,可能它必须对函数返回一个函数同时封闭一些可变变量。所以没有可见的突变。
可能Haskell社区已经发明了一个想法,即在范围内看不到的另一个区域发生了突变。我可能在这里含糊不清,所以寻求帮助以了解更多。
答案 0 :(得分:4)
隐藏变异是一个好主意,因此API的消费者不会意外地改变某些内容。这只是意味着你必须封装你的可变数据/状态。这可以通过对象(是的,对象)来完成,但是你在问题中提到的可以通过闭包来完成,规范的例子是一个计数器:
let countUp =
let mutable count = 0
(fun () -> count <- count + 1
count)
countUp() // 1
countUp() // 2
countUp() // 3
您无法直接访问可变计数变量。
答案 1 :(得分:2)
另一个例子是在函数中使用可变状态,这样你就无法观察它,并且对于所有意图和目的,函数都是参考透明的。例如,以下函数不是按字符顺序反转字符串,而是采用单个文本元素(根据语言,可以是多个字符):
let reverseStringU s =
if Core.string.IsNullOrEmpty s then s else
let rec iter acc (ee : System.Globalization.TextElementEnumerator) =
if not <| ee.MoveNext () then acc else
let e = ee.GetTextElement ()
iter (e :: acc) ee
let inline append x s = (^s : (member Append : ^x -> ^s) (s, x))
let sb = System.Text.StringBuilder s.Length
System.Globalization.StringInfo.GetTextElementEnumerator s
|> iter []
|> List.fold (fun a e -> append e a) sb
|> string
它在内部使用StringBuilder但你无法在外部观察它。