关于自定义数据类型和Haskell的困惑

时间:2014-05-17 02:36:29

标签: haskell

data Quant = Single | Multiple deriving (Show, Read, Eq)

data ListUnit = ListUnit {
    quant :: Quant,
    num :: Int,
    letter :: Char
    } deriving (Show, Read, Eq)

data ListUnit2 = ListUnit2 Quant Int Char deriving (Show, Read, Eq)

decodeModified :: Quant -> Int -> Char -> Char
decodeModified _ _ ls = ls

decodeModified2 :: ListUnit2 -> Char
decodeModified2 _ _ ls = ls

我是Haskell中数据类型的新手。我想知道为什么ListUnit有效,但我遇到了ListUnit2的问题。我知道我不应该像在第一个实例中那样打破所有ListUnits值。但是,当我没有,GHC,我没有传递足够的论据。我不知道我在做什么与Shapes example中的LYAH有什么不同。

如果有人想知道,这是针对" 99问题" #11。我想要建模的数据是[Multiple 4 'a',Single 'b',Multiple 2 'c', Multiple 2 'a',Single 'd',Multiple 4 'e']

1 个答案:

答案 0 :(得分:4)

问题在于:

decodeModified2 :: ListUnit2 -> Char

表示" decodeModified2接受ListUnit2 (类型) 并返回Char",而这个:

decodeModified2 _ _ ls = ls

表示" decodeModified2接受三个参数,丢弃前两个参数并返回第三个参数"。这两个陈述是不相容的。

我认为你的意思是:

decodeModified2 (ListUnit2 _ _ ls) = ls

表示" decodeModified2采用由ListUnit2 (函数) 构造的值,带有三个参数,丢弃前两个和返回第三个"。

这有意义吗?


在以下评论后编辑添加:同样,当您致电 decodeModified2时,您需要传递ListUnit2 <的实例子> (类型)。例如,您可以使用值构造函数decodeModified2 (ListUnit2 3 's' 'x') (函数) 来编写类似ListUnit2的内容来创建ListUnit2的实例<子>的(类型)。 (或者,更有趣的是:您可以在一个地方创建ListUnit2 (类型) 的实例,然后在另一个地方调用decodeModified2,传递所述实例。)

相关问题