1

我对 Haskell 有点陌生,但这种行为对我来说很奇怪。如果我有一个简单的函数定义如下:

foobar :: Integer -> [Integer] -> Integer
foobar x y = case y of
  (a:x:b) -> x
  _ -> -1

我基本上期望如果 y 包含至少两个元素并且 y 的第二个元素只是 foobar 的第一个参数,该函数应该评估为 foobar 的第一个参数。否则得到-1。但是在 ghci 中:

foobar 5 [6,7]

给我 7,而不是 -1。

我如何理解这种行为?

4

2 回答 2

13

您在这里所做的不是“更新”x变量,而是隐藏它。您正在创建一个x在 case 语句的第一个分支范围内调用的新变量。

您不能像我认为您正在尝试做的那样使用 case 语句来比较平等。如果这是您的目标,您将需要执行类似的操作

foobar :: Integer -> [Integer] -> Integer
foobar x y = case y of
    (a:x':b) | x == x' -> x
    _                  -> -1
于 2013-01-27T23:04:31.143 回答
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。

于 2013-01-28T16:04:55.887 回答