2012-03-31 22 views
4

ちょっと、私は再帰代数型のしくみと正確な使い方を理解する上で問題があります。値のセットを無限にする必要があると私は原理がの面でそれぞれの新しい値を表明することにある知っているので、私たちはここにRATを使用している関数型プログラミングでの再帰代数型の理解

data Nat = Zero | Succ Nat 

:例えば、自然数については、以下のRATの定義を取ります前の1つですが、これがどのように自然数を形成するのか分かりません。誰かがこれをクリアしてもいいですか?おかげ

+7

'Succ'を' 1 + 'で翻訳します。適切な数の操作のために、すべての自然数は '1 +(1 +(...(1 + 0)...))'です。 –

答えて

14

これは、と述べている:

  • Natがタイプです。

  • Zeroは、タイプNatです。 nNat型を持つ場合、これは自然数0

  • を表し、その後Succ nNat型を持ちます。これは、自然数n +1を表します。

したがって、例えば、Succ (Succ Zero)Succ (Succ (Succ (Succ Zero)))のように4を表し、そして、Succ (Succ (Succ Zero)) 3を表し、2を表します。

:(。0および後継者からの自然数を定義する。このシステムは Peano axiomsと呼ばれている)

実際には、ZeroSuccNat値を作成するために宣言された関数(コンストラクタ)だけの特別な種類があります

Zero :: Nat 
Succ :: Nat -> Nat 

定期的な機能の違いは、あなたはパターンマッチングでそれらを離れて取ることができるということです。

predecessor :: Nat -> Nat 
predecessor Zero = Zero 
predecessor (Succ n) = n 

これについては、再帰代数データ型、もちろん代数的データ型に特別なものは何もありません。代数的データ型がそのフィールドの1つと同じ型の値を持つことができるという単純な事実は、ここで再帰を作成するものです。

+0

このような明確な答えをお寄せいただきありがとうございます! Succのコンストラクタはn + 1を表すinbuilt関数ですか?私はそれが通常の方法で別の可能な価値を宣言していると思ったので混乱しました。数がnの場合、なぜ自然数の次の値であるn + 1の値を表現したいのですか?私たちが値nをどのように表現できるかとだけ関係はありませんか?最後にパターンマッチングビットをありがとう - それは非常に便利でした! – user1058210

+0

いいえ、組み込みではありません。あなたは 'Fnarf'に名前を変更することができ、まったく同じになります。考え方は、この型を定義し、その各値に自然数として*の意味*を割り当てることです。つまり、型を持つデータを表します。 'Succ n 'は* n *が* n *で表されるため、* n * + 1を表します。もしあなたが 'ゼロ '(0)を持っていて1を望むなら、0 + 1 = 1を表すために' Succ Zero'を使わなければなりません。 'Succ Zero'(1) 1 + 1 = 2 ...を表すために 'Succ(Succ Zero)'を使うこと。 – ehird

+3

@ user1058210いいえ、Succは組み込まれていません。それはあなたがコンストラクタに与えた名前です。 'n'から' n + 1'に到達する方法が必要なので、任意の数を表すことができます。定義が単に 'data Nat = Zero'だった場合は、ゼロを表すことができます。もちろん、あなたは 'data Nat = Zero | | 2つですが、そのアプローチでは有限数の数字しか得られません。 Succを使うと '' Succ 'を '' n' '回だけ '' 0' 'にして番号を表すことができます。 – sepp2k