【问题标题】:Other data types interaction with own constructed Natural datatype其他数据类型与自己构造的 Natural 数据类型交互
【发布时间】:2018-10-25 01:48:09
【问题描述】:

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

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 函数是否对此有所帮助。

更新:代码编译的一种方式是在函数中使用:

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

所以在这种情况下,我猜是相关的,但我想知道是否有一种“递归”方式来定义Suc Zeron-1 次的“循环”。 p>

最终更新:intToNat 定义如下:

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

【问题讨论】:

  • 您不需要(也不应该)在您的问题中包含答案。如果您觉得有必要分享解决方案,请将其发布为答案。

标签: haskell recursive-datastructures


【解决方案1】:

natToInt 看起来不错。 ZeroSucc nn 都具有 Natural 类型。 1 和 natToInt n 的类型为 Int。你在两个Ints 上调用+

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-21
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    相关资源
    最近更新 更多