2011-10-06 6 views
7

私はそのペアノ数に整数をオン機能Haskellのペアノ番号

toPeano :: Int -> Nat 
toPeano n = 

を書くしようとしています。例えば

data Nat = 
    Zero | 
    Succ Nat 
    deriving Show 

、その上

toPeano 0 = Zero 
toPeano 1 = Succ Zero 
toPeano 2 = Succ (Succ Zero) 

と:

は、私がデータを持っています。

整数を与えられたPeano Numbersを印刷する方法を知りません。私はPeano番号で働いたことがないので、これに関する助けがあれば幸いです!

ありがとうございました!

答えて

7

あなたの質問は明確ではないので、私は、変換から始めましょう:

toPeano 0 = Zero 
toPeano 1 = Succ Zero 
toPeano 2 = Succ (Succ Zero) 

これはかなり明示的です。あなたはすべてナチュラルのために簡単な再帰でペアノ番号を定義し、その仕事を持つことができます。

toPeano 0 = Zero 
toPeano x 
    | x < 0 = error "Can not convert a negative number to Peano" 
    | otherwise = Succ (toPeano (x-1)) 

ここでコアはSucc (toPeano (x-1))ある - これはちょうど、整数から1を減算し、ペアノの建設に1を追加します。

もう一方の方向はどうですか?さて、あなたは「成功回数」を見るたびに、あなただけの1を追加することができます。

fromPeano Zero = 0 
fromPeano (Succ x) = 1 + fromPeano x -- note this is inefficent but right now we don't care 

印刷が

さて、質問のように見えたあなたが言ったことの一部だけだった結果:

整数を与えられたPeano Numbersを印刷する方法を知りません。

これはペアノ​​番号とは何の関係もありませんが、GHCiの中であなただけのこれらの関数のいずれかを実行することができます。

> fromPeano (toPeano 5) 
5 

それとも、プログラムを作成し、結果をプリントアウトするprintを使用することができた:

main = print (toPeano 5829) 

とプログラム

$ ghc --make myProg.hs 
$ ./myProg 
Succ (Succ (Succ (... 
をコンパイルするためにGHCを使用
+0

「Natural」の数値型を使用することで、この「<0」のチェックを回避できますか? –

+0

もちろん、GADTを使用して1つの質問([http://stackoverflow.com/questions/11910143/positive-integer-type/11912348#11912348])でバイナリをエンコードし、これを行う方法が他にもあると確信しています。 –

1

このようなものはあなたが探しているものでしょうか?

toPeano 0 = Zero 
toPeano n = Succ $ toPeano (n-1)