Ocaml 语言懒散

Ocaml 语言懒散,ocaml,Ocaml,我知道如果我有c=a和b语句,如果a为false,那么编译器就不会费心计算b,它会知道结果,因为a已经为false 但是,如果我有一个递归函数,并将递归调用相加,会怎么样呢 So myfunc input1 input2 = and[myfunc(input1),myfunc(input2)] 如果从上述递归函数调用树中的任意点返回的函数返回值为false,那么递归函数调用是否会终止,并且值false将仅在原始调用点进行计算 换句话说,它会使用上面的惰性求值吗?我对Haskell不太熟悉,但是

我知道如果我有c=a和b语句,如果a为false,那么编译器就不会费心计算b,它会知道结果,因为a已经为false

但是,如果我有一个递归函数,并将递归调用相加,会怎么样呢

So myfunc input1 input2 = and[myfunc(input1),myfunc(input2)]
如果从上述递归函数调用树中的任意点返回的函数返回值为false,那么递归函数调用是否会终止,并且值false将仅在原始调用点进行计算


换句话说,它会使用上面的惰性求值吗?

我对Haskell不太熟悉,但是是的,它会在和的左侧求值整个递归调用树,只有当它们最终返回true时,它才会继续求值右侧的递归调用

事实上,它不会对这两个函数进行求值,直到您最终在打印中使用my_func的结果,但是如果您已经强制求值my_func,则上述内容仍然有效

把它看作是传递一个承诺,为它所做的每件事做变通。因此,调用my_func的结果不是结果,而是一个发现的承诺。它可能甚至没有想过这个承诺意味着什么,直到它不得不这么做。只有到那时,它才能进入并弄清楚它必须调用什么

我可能走了,但我就是这么理解的

是的。事实上,
的一个实现是递归的(并且没有添加任何严格性):

为了证明这是有效的,您可以将一个无限的
False
s列表传递给
,并查看它是否返回

Prelude> and (repeat False)
False

但是,请注意,对于无限多的
True
s列表,这不起作用,因为它将永远查找
False
,但永远找不到。

简而言之,答案是肯定的,Haskell在递归函数中是懒惰的

&&
的懒惰并不是特例:它是其定义的结果:

(&&) :: Bool -> Bool -> Bool
True  && y = y
False && _ = False
and :: [Bool] -> Bool
and []     = True
and (b:bs) = b && and bs
在这里,Haskell的懒惰意味着它可以在第一个参数上与
&&&
匹配,而第二个参数不需要计算就可以知道结果

对于像
这样的递归函数,我们有如下定义:

(&&) :: Bool -> Bool -> Bool
True  && y = y
False && _ = False
and :: [Bool] -> Bool
and []     = True
and (b:bs) = b && and bs
这是一个递归定义,Haskell很懒惰,因为非空列表中的
b
bs
的值只有在需要时才会计算:在这种情况下,
&
的定义迫使我们查看第一个元素
b
,如果是
False
,则不必对其余的
bs
进行评估

这里的教训是,懒惰是Haskell凭借其模式匹配提供的:当消耗足够的输入来匹配一个模式时,其余的可以不计算,直到需要为止

如果从上述递归函数调用树中的任意点返回的函数返回值为false,那么递归函数调用是否会终止,并且值false将仅在原始调用点进行计算

您可以编写依赖于该行为的递归调用。例如,如果对列表中的每个元素应用给定谓词函数
p
的结果对任何元素返回
true
,则OCaml中的以下
exists
函数返回
true

let rec exists p = function
  | [] -> false
  | x::xs -> p x || exists p xs
由于短路评估,只要
p
第一次返回
true
,就会停止对列表的迭代

换句话说,它会使用上面的惰性评估吗


请注意,这不是懒惰。

是的,只要你说了一大堆“假”,我就知道你会说什么了!:)顺便说一句,它实际上被定义为
和=foldr(&&&)True
@fuzzxl,有时。。我不确定
USE\u REPORT\u PRELUDE
什么时候是真的。我对这些IFDEF知之甚少。但我从中得到了定义。我想我应该看看haskell的报告?没关系。。我想我现在明白了<当需要使用haskell报告中定义的前奏曲时,代码>使用报告前奏曲为真。我想下次我应该再仔细看看。我修正了我的答案(通过说一个实现)。在OCaml(和大多数其他语言)中,这是短路评估,而不是懒惰。