1

私はHaskellに少し慣れていませんが、この振る舞いは私には奇妙です。次のように定義された単純な関数がある場合:

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

基本的に、yに少なくとも2つの要素が含まれ、yの2番目の要素がfoobarの最初の引数である場合、関数はfoobarの最初の引数に評価されるはずです。それ以外の場合は-1を取得します。しかし、ghciでは:

foobar 5 [6,7]

-1ではなく7をくれます。

この動作をどのように理解しますか?

4

2 に答える 2

13

ここで行っているのは、変数を「更新」することではなく、x変数をシャドウイングすることです。xcaseステートメントの最初のブランチのスコープで呼び出される新しい変数を作成しています。

あなたがやろうとしていると私が信じているように、平等を比較するために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]と、14ではなく12が生成されます。

于 2013-01-28T16:04:55.887 に答える