Haskell如何使用map返回列表?

-3 haskell list

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

makeList :: Car -> [Make]
makeList map f ???
Run Code Online (Sandbox Code Playgroud)

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

data Car = Model Make Car | Tail

> makeList (Car Audi (Car Porsche Tail))
  [Audi,Porsche]
> makeList Tail
  [ ]
Run Code Online (Sandbox Code Playgroud)

bhe*_*ilr 5

Car类型等价(数学家会用这个词同构)在Haskell中专门列出的Make数据类型.Haskell列表定义为

data [a] = a : [a] | []
Run Code Online (Sandbox Code Playgroud)

构造者在哪里:和哪个[].如果我们给他们更多人类可读的名字,它可能更有意义

data List a = Cons a (List a) | Empty
Run Code Online (Sandbox Code Playgroud)

所有我所做的就是替代[a]List a,:对于Cons[]Empty.如果我们将其专门化为特定类型,例如Int,我们就可以

data List = Cons Int List | Empty
Run Code Online (Sandbox Code Playgroud)

现在我们看到Haskell的列表和你之间的关系Car类型,它只是Car = List,Model = ConsTail = Empty.

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

makeList :: Car -> [Make]
makeList Tail = []
makeList (Car make nextCar) = ...
Run Code Online (Sandbox Code Playgroud)

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