2011-04-09 48 views
0

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 

回答

3

b号进行评估,以WHNF检查使用了哪个Bool构造。那时候,没有什么可以评估的。

+1

对于'case Three'='| Two | Three'这样的情况,也是这种情况,例如{One - > 17; _ - > 18}'? – user2023370 2011-04-09 16:35:29

+1

@ user643722是的,没什么值得懒惰的。将构造函数想象为一个值的层次。你的情况表达式检查顶层,因此必须评估任何值为“x”的这一层。像“Bool”或“Three”这样的类型,第一层下面没有任何东西。 – Anthony 2011-04-09 17:17:06

+0

感谢您的澄清。我知道现在这个图层已经暴露出来了。但'case'表达式(对于'Three')只确定它是否等于'One'。目前还不知道它是'Two'还是'Three',不是? – user2023370 2011-04-09 23:31:56

2

否,这种情况下的表达将评估B,但其特征在于,它包含当然只如果表达式本身被评估因任何原因。

例如,在

(42, case b of { True -> 43; False -> 41}) 

B就不会被评估,直到元组的第二个要素是。

一般来说,如果以前的模式有必要评估该值,那么无可辩驳的模式不会增加懒惰 - 请记住,案例模式严格遵循给定顺序。由于没有任何东西像“未评估”始终评估的值,所以案例表达仍然被评估。