给出Elem如下定义的项目列表:
date El = Star | War
在Haskell中实现以下功能:
countWar :: [Elem] -> Int
计算元素的数量" War"在作为参数
传递的列表中这是Haskell的第一次练习,任何人都可以帮助我吗? 我无法理解星和战争是什么......
感谢大家!
答案 0 :(得分:3)
Star
和War
是E1
类型的构造函数,尽管您稍后将其称为Elem
。构造函数就像特殊函数一样,它接受零个或多个现有值,并使用它们来构造新类型的值。使用这样的构造函数的常用方法是通过模式匹配:
data Elem = Star | War
isStar :: Elem -> Bool
isStar Star = True
isStar War = False
isWar :: Elem -> Bool
isWar War = True
isWar Star = False
列表也可以模式匹配
sum :: [Int] -> Int
sum [] = 0 -- The sum of an empty list is 0
sum (x:xs) = x + sum xs -- The sum of a non-empty list is the first
-- element plus the sum of the rest of the list
每当您看到[1, 2, 3]
之类的内容时,实际上会将此转换为1:2:3:[]
,因为[]
已定义为(有效)为
data [a] = [] | a : [a]
[1, 2, 3]
语法只是编译器提供的糖,以便更容易使用列表文字,但编译器实际上只是根据空列表[]
和{{1}来看待它},我们称之为" cons"。
这是否可以为您提供有关如何实施:
?
答案 1 :(得分:0)
您可以在定义函数时使用模式匹配来计算War数据
data Elem = Star | War
countWar:: [Elem] -> Int
countWar [] = 0
countWar (War:xs) = 1 + countWar xs
countWar (_:xs) = countWar xs