F#隐藏突变

时间:2018-04-11 00:48:44

标签: f#

任何人都有一个不错的例子,最好是实用/有用,他们可以发布演示这个概念吗?

我在某个地方找到了我无法找到的这个术语,可能它必须对函数返回一个函数同时封闭一些可变变量。所以没有可见的突变。

可能Haskell社区已经发明了一个想法,即在范围内看不到的另一个区域发生了突变。我可能在这里含糊不清,所以寻求帮助以了解更多。

2 个答案:

答案 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但你无法在外部观察它。

相关问题