Haskell Peano数字

时间:2011-10-06 02:02:53

标签: haskell integer peano-numbers

我正在尝试编写一个函数

toPeano :: Int -> Nat
toPeano n =

将整数变为其Peano数。

我有数据:

data Nat =
   Zero |
   Succ Nat
   deriving Show

例如,

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

等等。

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

谢谢!

2 个答案:

答案 0 :(得分:7)

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

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

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

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)) - 这只是从整数中减去一个,并将一个加到Peano构造中。

现在另一个方向怎么样?好吧,每当你看到“Succ”时,你只需添加一个:

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

打印结果

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

  

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

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

> fromPeano (toPeano 5)
5

或者您可以创建一个程序并使用print打印出结果:

main = print (toPeano 5829)

并使用GHC编译程序

$ ghc --make myProg.hs
$ ./myProg
Succ (Succ (Succ (...

答案 1 :(得分:1)

这样的事情会是你想要的吗?

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