Haskell模式绑定破坏性地修改变量?

时间:2013-01-27 23:01:52

标签: haskell

我对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。

我如何理解这种行为?

2 个答案:

答案 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。