繁体   English   中英

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

[英]Confusion about custom data types and 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示例中,我看不到我在做什么与LYAH有什么不同。

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

问题是:

decodeModified2 :: ListUnit2 -> Char

and returns a Char ", whereas this: 意思是“ decodeModified2采用一个ListUnit2 并返回一个Char ”,而这是:

decodeModified2 _ _ ls = ls

意思是“ decodeModified2接受三个参数,丢弃前两个参数并返回第三个参数”。 这两个语句不兼容。

我认为您的意思是:

decodeModified2 (ListUnit2 _ _ ls) = ls

with three arguments, discarding the first two and returning the third". 这意味着“ decodeModified2采用由ListUnit2 构造的具有三个参数的值,丢弃前两个参数并返回第三个参数”。

那有意义吗?


. 编辑后在下面的注释后添加 :同样,当您调用 decodeModified2 ,您需要传递ListUnit2 的实例。 to create an instance of ListUnit2 . 例如,您可以使用值构造函数ListUnit2 创建ListUnit2 的实例,编写类似decodeModified2 (ListUnit2 3 's' 'x') in one place and then call decodeModified2 in a different place, passing said instance.) (或者,更有趣的是:您可以在一个地方创建ListUnit2 的实例,然后在另一个地方调用decodeModified2 ,并传递该实例。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM