其他数据类型与自己构造的 Natural 数据类型交互
Other data types interaction with own constructed Natural datatype
我已经为自然数构建了自己的数据类型。
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.
所以在这种情况下,我猜是相关的,但我想知道是否有 'recursive' 方法来定义 Suc Zero
'loop' n -1次。
最终更新: intToNat
定义如下:
intToNat:: Int -> Natural
intToNat 0 = Zero
intToNat n = Suc(intToNat (n-1))
natToInt
看起来不错。 Zero
、Succ n
和 n
都有类型 Natural
。 1 并且 natToInt n
的类型为 Int
。您在两个 Int
上调用 +
。
在 inToNat
中,n
具有类型 Int
,但 Succ
需要 Natural
。然后您尝试从 Natural
中减去 1,但是您没有为 Natural
定义 -
(至少,没有在您问题的代码中定义)。您的 intToNat
不是递归的,但您可能希望它是。
总的来说,您的方向是正确的。 read
没有必要。
我已经为自然数构建了自己的数据类型。
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.
所以在这种情况下,我猜是相关的,但我想知道是否有 'recursive' 方法来定义 Suc Zero
'loop' n -1次。
最终更新: intToNat
定义如下:
intToNat:: Int -> Natural
intToNat 0 = Zero
intToNat n = Suc(intToNat (n-1))
natToInt
看起来不错。 Zero
、Succ n
和 n
都有类型 Natural
。 1 并且 natToInt n
的类型为 Int
。您在两个 Int
上调用 +
。
在 inToNat
中,n
具有类型 Int
,但 Succ
需要 Natural
。然后您尝试从 Natural
中减去 1,但是您没有为 Natural
定义 -
(至少,没有在您问题的代码中定义)。您的 intToNat
不是递归的,但您可能希望它是。
总的来说,您的方向是正确的。 read
没有必要。