我是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
。