在函数中添加数据类型



我是Haskell的新手,正在学习数据类型。 我试图做一个简单的问题,但我似乎无法掌握更大的图景。 我有一个数据类型 长度单位,类似于英寸、英尺和码。 我想创建一个函数,该函数获取 LengthUnits 列表并将它们转换为英寸并对所有元素求和。

我创建了一个辅助函数转换,它将长度单位转换为英寸。我也有addLengths,它接受两个LengthUnit并将它们相加。 我似乎无法获得我正在寻找的输出。 这是我所拥有的:

data LengthUnit =  INCH  Int | FOOT  Int | YARD  Int
deriving (Show, Read, Eq)
convert :: LengthUnit -> Int  
convert (INCH x) =  (x) 
convert (FOOT x) =  (x * 12)
convert (YARD x) =  (x * 36)
-- addLengths 
addLengths :: LengthUnit -> LengthUnit -> LengthUnit
addLengths x y = INCH ((convert x) + (convert y))

-- addAllLengths
--addAllLengths :: Foldable t => [t LengthUnit] -> LengthUnit
addAllLengths list = let nList = map convert list
in foldr addLengths 0 nList

从上面我得到一个错误:无法将类型"Int"与"长度单位"匹配。 任何帮助将不胜感激。

我希望得到这样的东西:

addAllLengths [[FOOT 2], [FOOT 2, INCH 2],[]]
INCH 50

试试这个:

addAllLengths list = foldr addLengths (INCH 0) (concat list)

concat[[FOOT 2], [FOOT 2, INCH 2],[]]变成[FOOT 2, FOOT 2, INCH 2],然后foldr addLengths (INCH 0)把它变成INCH 50

最新更新