我对Haskell有点新鲜,但这种行为对我来说很奇怪。如果我有一个如下定义的简单函数:
foobar :: Integer -> [Integer] -> Integer
foobar x y = case y of
(a:x:b) -> x
_ -> -1
我基本上期望函数应该计算foobar的第一个参数,如果y包含至少两个元素而y的第二个元素只是foobar的第一个参数。否则得-1。但是在ghci:
foobar 5 [6,7]
给我7,而不是-1。
我如何理解这种行为?
答案 0 :(得分:13)
你在这里做的不是“更新”x
变量而是遮蔽它。
您正在第一个分支的范围内创建一个名为x
的新变量
你的案例陈述。
您不能使用案例陈述来比较我认为您的平等 试图做。如果这是您的目标,您将需要执行类似
的操作foobar :: Integer -> [Integer] -> Integer
foobar x y = case y of
(a:x':b) | x == x' -> x
_ -> -1
答案 1 :(得分:4)
您可以通过调整代码来判断x
没有破坏性更新:
foobar :: Integer -> [Integer] -> Integer
foobar x y = (case y of
(a:x:b) -> x
_ -> -1
) + x
最后的x
将使用原始x
值;它不会被破坏,而是x
表达式中的case
绑定被遮蔽。调用foobar 5 [6,7]
将产生12,而不是14。