我已经为自然数构造了自己的数据类型。
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))
答案 0 :(得分:5)
natToInt
看起来不错。 Zero
,Succ n
和n
的类型均为Natural
。 1和natToInt n
的类型为Int
。您在两个+
上致电Int
。
在inToNat
中,n
的类型为Int
,但是Succ
需要一个Natural
。然后,您尝试从Natural
中减去1,但尚未为-
定义Natural
(至少在问题代码中未定义)。您的intToNat
不是递归的,但您可能希望它是递归的。
您通常走在正确的轨道上。不需要read
。