ちょっと、私は再帰代数型のしくみと正確な使い方を理解する上で問題があります。値のセットを無限にする必要があると私は原理がの面でそれぞれの新しい値を表明することにある知っているので、私たちはここにRATを使用している関数型プログラミングでの再帰代数型の理解
data Nat = Zero | Succ Nat
:例えば、自然数については、以下のRATの定義を取ります前の1つですが、これがどのように自然数を形成するのか分かりません。誰かがこれをクリアしてもいいですか?おかげ
ちょっと、私は再帰代数型のしくみと正確な使い方を理解する上で問題があります。値のセットを無限にする必要があると私は原理がの面でそれぞれの新しい値を表明することにある知っているので、私たちはここにRATを使用している関数型プログラミングでの再帰代数型の理解
data Nat = Zero | Succ Nat
:例えば、自然数については、以下のRATの定義を取ります前の1つですが、これがどのように自然数を形成するのか分かりません。誰かがこれをクリアしてもいいですか?おかげ
これは、と述べている:
Nat
がタイプです。
Zero
は、タイプNat
です。 n
はNat
型を持つ場合、これは自然数0
を表し、その後Succ n
はNat
型を持ちます。これは、自然数n +1を表します。
したがって、例えば、Succ (Succ Zero)
はSucc (Succ (Succ (Succ Zero)))
のように4を表し、そして、Succ (Succ (Succ Zero))
3を表し、2を表します。
実際には、Zero
とSucc
はNat
値を作成するために宣言された関数(コンストラクタ)だけの特別な種類があります
Zero :: Nat
Succ :: Nat -> Nat
定期的な機能の違いは、あなたはパターンマッチングでそれらを離れて取ることができるということです。
predecessor :: Nat -> Nat
predecessor Zero = Zero
predecessor (Succ n) = n
これについては、再帰代数データ型、もちろん代数的データ型に特別なものは何もありません。代数的データ型がそのフィールドの1つと同じ型の値を持つことができるという単純な事実は、ここで再帰を作成するものです。
このような明確な答えをお寄せいただきありがとうございます! Succのコンストラクタはn + 1を表すinbuilt関数ですか?私はそれが通常の方法で別の可能な価値を宣言していると思ったので混乱しました。数がnの場合、なぜ自然数の次の値であるn + 1の値を表現したいのですか?私たちが値nをどのように表現できるかとだけ関係はありませんか?最後にパターンマッチングビットをありがとう - それは非常に便利でした! – user1058210
いいえ、組み込みではありません。あなたは 'Fnarf'に名前を変更することができ、まったく同じになります。考え方は、この型を定義し、その各値に自然数として*の意味*を割り当てることです。つまり、型を持つデータを表します。 'Succ n 'は* n *が* n *で表されるため、* n * + 1を表します。もしあなたが 'ゼロ '(0)を持っていて1を望むなら、0 + 1 = 1を表すために' Succ Zero'を使わなければなりません。 'Succ Zero'(1) 1 + 1 = 2 ...を表すために 'Succ(Succ Zero)'を使うこと。 – ehird
@ user1058210いいえ、Succは組み込まれていません。それはあなたがコンストラクタに与えた名前です。 'n'から' n + 1'に到達する方法が必要なので、任意の数を表すことができます。定義が単に 'data Nat = Zero'だった場合は、ゼロを表すことができます。もちろん、あなたは 'data Nat = Zero | | 2つですが、そのアプローチでは有限数の数字しか得られません。 Succを使うと '' Succ 'を '' n' '回だけ '' 0' 'にして番号を表すことができます。 – sepp2k
'Succ'を' 1 + 'で翻訳します。適切な数の操作のために、すべての自然数は '1 +(1 +(...(1 + 0)...))'です。 –