私はこの問題をGitHubから、ハスケルの第1原則で尋ねられました。ここで私は私が唯一の識別子に式を割り当てることができると思った(ただ、X)= integerToNat $ I-1構文はどこで動作しますか?
で混乱しているコード
data Nat = Zero | Succ Nat deriving (Eq, Show) integerToNat :: Integer -> Maybe Nat integerToNat i | i < 0 = Nothing | i == 0 = Just Zero | i > 0 = Just (Succ x) where (Just x) = integerToNat $ i-1
です
where
にあります。しかし、(Just x)
は割り当てられた式の値をアンパックし、x
を(Succ x)
に戻すように見えます。誰かがこれがなぜ機能するのか説明できますか?
なぜですか? ;)あなたは基本的に正しいです、それはrhsをアンパックします。これは 'natToInteger Zero = 0;のような関数定義のために働くパターンマッチングマシンと同じです。 natToInteger(Succ x)= 1 + natToInteger x'である。 –
'Just x = ...'がパターンマッチングによって 'x'を定義していても、これは危険です:' x'が要求されたとき、パターンが一致しないとき(例:再帰呼び出しが'Nothing')、実行時エラーが発生し、プログラム全体がクラッシュします。もちろん、ここでそれは起こることはありませんが、それを確実にするのはプログラマの負担です。 – chi