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']
。
答案 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
,传递所述实例。)