Haskell如何使用map返回列表?

时间:2015-09-27 04:54:31

标签: list haskell

我对如何返回数据类型中的某些内容列表感到困惑。我想我必须使用map函数,但我不确定如何在这个上下文中使用它。例如,如果我有下面的数据类型(我知道很奇怪,但具体而言),我将如何编写函数

makeList :: Car -> [Make]
makeList map f ???

返回输入中所有汽车的品牌列表(如下所示),以及空列表[]如果" makeList Tail"给出了。

data Car = Model Make Car | Tail

> makeList (Car Audi (Car Porsche Tail))
  [Audi,Porsche]
> makeList Tail
  [ ]

1 个答案:

答案 0 :(得分:5)

Car类型是等效的(数学家会使用术语 isomorphic )来表示专门用于Make数据类型的Haskell中的列表。 Haskell列表定义为

data [a] = a : [a] | []

:[]是构造函数。如果我们给他们更多人类可读的名字,那可能会更有意义

data List a = Cons a (List a) | Empty

我所做的就是用[a]替换List a,用:代替Cons,用[]代替Empty。如果我们将其专门化为特定类型,例如Int,我们就会

data List = Cons Int List | Empty

现在我们看到Haskell列表与您的Car类型之间存在关联,它只是Car = ListModel = ConsTail = Empty

您的makeList函数实际上只是将Car样式列表转换为[]样式列表,map不是必需的(并且没有用处,因为它只适用于[]样式列表)。相反,你只需要做正确的替换

makeList :: Car -> [Make]
makeList Tail = []
makeList (Car make nextCar) = ...

我不想放弃所有东西,因为这听起来像家庭作业,但此时你只需要使makeList的第二个子句递归地构造一个普通的[]样式列表。同样,大提示是“递归”和“[]样式列表”。