2017-06-11 5 views
3

私はこの問題を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)に戻すように見えます。

誰かがこれがなぜ機能するのか説明できますか?

+0

なぜですか? ;)あなたは基本的に正しいです、それはrhsをアンパックします。これは 'natToInteger Zero = 0;のような関数定義のために働くパターンマッチングマシンと同じです。 natToInteger(Succ x)= 1 + natToInteger x'である。 –

+0

'Just x = ...'がパターンマッチングによって 'x'を定義していても、これは危険です:' x'が要求されたとき、パターンが一致しないとき(例:再帰呼び出しが'Nothing')、実行時エラーが発生し、プログラム全体がクラッシュします。もちろん、ここでそれは起こることはありませんが、それを確実にするのはプログラマの負担です。 – chi

答えて

4

ハスケルcontext free syntax、関数の右側(RHS)についてのエントリを有する:

RHS&RIGHTARROW。 = EXP [where decls]
                | gdrhs [where decls]

我々はwhere構文を取得するためにdeclsに見て取らなければならないので、その平均値。 declsは、declsのシーケンスです。

次のようになります。 {; ...;赤緯 N}

そしてdeclは再び二つの可能なルールがあります

赤緯&RIGHTARROWと、 gendecl
              | (funlhs | pat)rhs

つまり、where句の左側にパターン(pat)を宣言できます。実際にはwhere a = 1で、aは既に話すパターンです。パターンは1つの変数から構成されます。しかし、コンストラクタ、エイリアス演算子などは、すべてwhere節の左側で受け入れられます。

パターンは変数、ジェネリックコンストラクタ、修飾コンストラクタ、literatal、ワイルドカード、リストパターン、タプルパターン、反駁パターン等here見出すことができるパターンについて次に全体の文法であってもよいです。要するに、関数の先頭でパターンマッチングのように機能します。

+0

つまり、コンストラクタのマッチングをサポートする場所はどこからでも書くことができるということです。明確にしてくれてありがとう。 –

+1

@NirvinM:はい 'where'節は、関数の先頭にあるパターンマッチングシステムのように動作します。 –

関連する問題