作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要一些关于 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 的行为是什么?
anotherFunction
吗?anotherFunction
的结果吗?最佳答案
在这两种情况下,除非需要该值,否则它不会评估任何内容。请求该值的一种方法是调用 ghci 中的函数(它打印 ghci 中的值,从而请求该值)。假设您正在执行该函数,那么在第二种情况下,它将将该元组计算为 weak head normal form (WHNF)然后评估 (a,b,c,d)
中的第一个元素,因为只需要该值。其他元素 b
、c
和 d
将采用 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/
我目前正在研究数据库,我看到 degree 和 cardinality 用作相同的术语,或在某些其他学位定义为否。关系中涉及的实体的数量,并进一步分类为一元、二元和三元。 某些放置度数定义为关系类型的
我是一名优秀的程序员,十分优秀!