gpt4 book ai didi

.net - F# 短路模式匹配

转载 作者:行者123 更新时间:2023-12-04 17:27:11 24 4
gpt4 key购买 nike

F# 新手。下面的问题可能完全没有意义。

// an attempt at Huffman encoder 
let encodeValue x y = function ...

match ((encodeValue left value), (encodeValue right value)) with
| ((true, encoded), (_, _)) -> (true, encoded + "1")
| ((_, _), (true, encoded)) -> (true, encoded + "0")
| ((false, _), (false, _)) -> (false, "")
| _ -> failwith "Error"

在真实环境中,encodeValue 可能非常昂贵。是否有可能(或合理)要求 F# 评估 encodeValue left value首先,尝试匹配,然后执行 encodeValue right value必要时?

最佳答案

您可以使用惰性值和事件模式很好地模拟短路:

//not sure why function Lazy.force is recognized in VS but not in FSI
//need to use member Force()
let (|Force|) (l:Lazy<_>) =
l.Force()

let encodeValue x y = function ...

match (encodeValue left value), lazy(encodeValue right value) with
| (true, encoded), _ -> (true, encoded + "1")
| _ , Force(true, encoded) -> (true, encoded + "0")
| (false, _) , Force(false, _) -> (false, "")
| _ -> failwith "Error"
Lazy值计算 0 次或 1 次:如果您从不调用 Force()在他们身上,他们永远不会被计算。第一次调用 Force()每隔一次调用 Force() 就会计算它们并保存结果.
(|Force|)这是一个完整的事件模式,一个非常简洁的功能,它允许您实现各种自定义模式匹配结构。

请注意@Brian 指出您需要使用 _在可能发生短路的惰性值位置。如 (true, encoded)匹配然后懒惰,昂贵的计算永远不会被强制。然后对于每个其他情况,使用 (|Force|) 进行多次匹配事件模式将只使用第一个事件的结果。

更新

@Daniel 指出 F# 已经有一个事件模式,它完全可以做 (|Force|)做: http://msdn.microsoft.com/en-us/library/ee340223.aspx

关于.net - F# 短路模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6951410/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com