gpt4 book ai didi

haskell - Haskell 懒到什么程度了?

转载 作者:行者123 更新时间:2023-12-02 06:40:10 26 4
gpt4 key购买 nike

我需要一些关于 Haskell 惰性的澄清。

如果我有这个功能:

myFunction arg
| arg == 1 = a
| arg == 2 = a*b
| arg == 3 = b+c
| otherwise = (a+b)*c
where
a = ...
b = ...
c = ...
d = ...

当我调用 myFunction 1 时,Haskell 将仅计算 a = ... 函数,而不会计算 b 函数> 也不是c,也不是d

但是如果我写

myFunction arg
| arg == 1 = a
| arg == 2 = a*b
| arg == 3 = b+c
| otherwise = (a+b)*c
where
(a,b,c,d) = anotherFunction arg

Haskell 的行为是什么?

  • 它会只评估a并将惰性“传播”到anotherFunction吗?
  • 或者,它会评估整个元组(a,b,c,d)作为anotherFunction的结果吗?

最佳答案

在这两种情况下,除非需要该值,否则它不会评估任何内容。请求该值的一种方法是调用 ghci 中的函数(它打印 ghci 中的值,从而请求该值)。假设您正在执行该函数,那么在第二种情况下,它将将该元组计算为 weak head normal form (WHNF)然后评估 (a,b,c,d) 中的第一个元素,因为只需要该值。其他元素 bcd 将采用 thunk 形式。事实上你可以自己验证一下:

myFunction arg
| arg == 1 = a
| arg == 2 = a*b
| arg == 3 = b+c
| otherwise = (a+b)*c
where
(a,b,c,d) = anotherFunction arg

anotherFunction x = (x, undefined, undefined, undefined)

ghci 中的演示:

λ> myFunction 1
1

关于haskell - Haskell 懒到什么程度了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29365840/

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