其他数据类型与自己构造的Natural数据类型的交互

时间:2018-10-25 01:48:10

标签: haskell recursive-datastructures

我已经为自然数构造了自己的数据类型。

data Natural = Zero | Succ Natural 
instance Show Natural where 
         show (Zero) = "0"
         show (Succ Zero) = "S 0"
         show (Succ n) = "S(" ++ show n ++ ")"

我正在尝试使函数与定义如下的基本数据类型(主要是Int)进行交互:

intToNat:: Int -> Natural
intToNat 0 = Zero
intToNat n = (Succ n) - 1

natToInt:: Natural -> Int
natToInt Zero = 0
natToInt (Succ n) = 1 + natToInt n

嗯,这根本不起作用,问题是,我必须将此函数保留为递归函数。我不知道read函数对此是否有帮助。

UPDATE :函数中使用了一种代码编译方式:

intToNat:: Int -> Natural
intToNat 0 = Zero
intToNat n = Succ(Succ Zero) --Obviusly this method return a constant number, in this case: 2.

因此,在这种情况下,我想这是相关的,但我想知道是否存在一种“递归”方式来定义Suc Zero n-1 次的“循环”。

最终更新: intToNat的定义如下:

intToNat:: Int -> Natural
intToNat 0 = Zero
intToNat n = Suc(intToNat (n-1))

1 个答案:

答案 0 :(得分:5)

natToInt看起来不错。 ZeroSucc nn的类型均为Natural。 1和natToInt n的类型为Int。您在两个+上致电Int

inToNat中,n的类型为Int,但是Succ需要一个Natural。然后,您尝试从Natural中减去1,但尚未为-定义Natural(至少在问题代码中未定义)。您的intToNat不是递归的,但您可能希望它是递归的。

您通常走在正确的轨道上。不需要read