7

我正在尝试编写一个函数

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 号码,因此我们将不胜感激任何帮助!

谢谢!

4

2 回答 2

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))- 这只是从整数中减去 1 并在 Peano 结构中加 1。

现在另一个方向呢?好吧,每次看到“成功”时,您只需添加一个:

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

打印结果

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

我不知道如何让它打印出给定整数的皮亚诺数。

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

> fromPeano (toPeano 5)
5

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

main = print (toPeano 5829)

并使用GHC编译程序

$ ghc --make myProg.hs
$ ./myProg
Succ (Succ (Succ (...
于 2011-10-06T02:29:04.230 回答
1

像这样的东西会是你要找的吗?

toPeano 0 = Zero
toPeano n = Succ $ toPeano (n-1)
于 2011-10-06T10:34:25.957 回答