Haskell通用数据类型

时间:2015-03-19 13:15:45

标签: haskell

给出Elem如下定义的项目列表:

date El = Star | War

在Haskell中实现以下功能:

countWar :: [Elem] -> Int

计算元素的数量" War"在作为参数

传递的列表中

这是Haskell的第一次练习,任何人都可以帮助我吗? 我无法理解星和战争是什么......

感谢大家!

2 个答案:

答案 0 :(得分:3)

StarWarE1类型的构造函数,尽管您稍后将其称为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