Haskell Peano数字

Sha*_*abu 7 haskell integer peano-numbers

我正在尝试编写一个函数

toPeano :: Int -> Nat
toPeano n =
Run Code Online (Sandbox Code Playgroud)

将整数转换为其Peano数.

我有数据:

data Nat =
   Zero |
   Succ Nat
   deriving Show
Run Code Online (Sandbox Code Playgroud)

例如,

toPeano 0 = Zero
toPeano 1 = Succ Zero
toPeano 2 = Succ (Succ Zero)
Run Code Online (Sandbox Code Playgroud)

等等.

我不知道如何在给定整数的情况下打印出Peano数字.我从未使用过Peano号码,所以对此有任何帮助将不胜感激!

谢谢!

Tho*_*son 7

你的问题不明确,所以我将从转换开始:

toPeano 0 = Zero
toPeano 1 = Succ Zero
toPeano 2 = Succ (Succ Zero)
Run Code Online (Sandbox Code Playgroud)

这很明确.您可以使用简单的递归定义Peano数字,并使其适用于所有自然:

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

这里的核心是Succ (toPeano (x-1))- 这只是从整数中减去一个,并将一个加到Peano结构中.

现在另一个方向怎么样?好吧,每次看到"Succ",你都可以添加一个:

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

打印结果

现在你说的看起来像一个问题的唯一部分是:

我不知道如何在给定整数的情况下打印出Peano数字.

这与Peano数字无关,但在GHCi中你可以运行以下任一功能:

> fromPeano (toPeano 5)
5
Run Code Online (Sandbox Code Playgroud)

或者你可以制作一个程序并print用来打印结果:

main = print (toPeano 5829)
Run Code Online (Sandbox Code Playgroud)

并使用GHC编译程序

$ ghc --make myProg.hs
$ ./myProg
Succ (Succ (Succ (...
Run Code Online (Sandbox Code Playgroud)