布尔表达式中的Lazy Haskell模式?
问题描述:
在case
表达如:布尔表达式中的Lazy Haskell模式?
case b of True -> 17
False -> 18
会有任何懒惰在:
case b of True -> 17
_ -> 18
即使用_
图案代替False
?
如果没有懒惰为Bool
是,也为如此:
data Three = One|Two|Three
case x of One -> 17
_ -> 18
答
b
号进行评估,以WHNF检查使用了哪个Bool
构造。那时候,没有什么可以评估的。
答
否,这种情况下的表达将评估B,但其特征在于,它包含当然只如果表达式本身被评估因任何原因。
例如,在
(42, case b of { True -> 43; False -> 41})
B就不会被评估,直到元组的第二个要素是。
一般来说,如果以前的模式有必要评估该值,那么无可辩驳的模式不会增加懒惰 - 请记住,案例模式严格遵循给定顺序。由于没有任何东西像“未评估”始终评估的值,所以案例表达仍然被评估。
对于'case Three'='| Two | Three'这样的情况,也是这种情况,例如{One - > 17; _ - > 18}'? – user2023370 2011-04-09 16:35:29
@ user643722是的,没什么值得懒惰的。将构造函数想象为一个值的层次。你的情况表达式检查顶层,因此必须评估任何值为“x”的这一层。像“Bool”或“Three”这样的类型,第一层下面没有任何东西。 – Anthony 2011-04-09 17:17:06
感谢您的澄清。我知道现在这个图层已经暴露出来了。但'case'表达式(对于'Three')只确定它是否等于'One'。目前还不知道它是'Two'还是'Three',不是? – user2023370 2011-04-09 23:31:56