gpt4 book ai didi

f# - 奇怪的行为定义意味着 F# 中的运算符

转载 作者:行者123 更新时间:2023-12-01 06:18:21 26 4
gpt4 key购买 nike

我尝试在 F# 中定义自己的逻辑隐含运算符,如下所示

let (-->) p q = (not p) || q

但是当我实际尝试时,它似乎没有实现短路 OR

> false --> ((2/0)=1);;
System.DivideByZeroException: Attempted to divide by zero.at <StartupCode$FSI_0015>.$FSI_0015.main@()
Stopped due to error
>

它不应该计算结果但它是

谁能看出这里出了什么问题?我在 VS 2012 中运行 F#

最佳答案

当你写 a --> b 时,真正发生的是调用一个名为 --> 的函数,它有两个参数,aboperator 语法只是一些语法糖。

在调用函数之前,运行时必须评估该函数的所有参数。因此,在调用 --> 之前,它首先评估 false,然后评估 (2/0)=1。在评估最后一个表达式时,它会抛出异常。您的隐含函数永远不会被调用!

在其他一些语言中,比如 Haskell,你有惰性评估。也就是说,函数的参数只有在函数内部实际访问时才会被评估。您可以通过不传递值,而是传递计算结果为该值的函数或 thunk 来模拟它正如其名。

请注意,要在 F# 中实现这种功能(thunk),必须对该函数稍作修改:它必须调用 thunk 以获取其值,就像下面给出的示例一样约翰·帕尔默:

let --> p q = (not p) || q()
let thunk = (fun _ -> ((2/0)=1))
false --> thunk

请注意 implies 运算符定义中的函数调用 q()。如果你不在第二个参数上给它一个 thunk,它将不再工作!

关于f# - 奇怪的行为定义意味着 F# 中的运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17869367/

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