繁体   English   中英

Haskell 如何使用 map 返回一个列表?

[英]Haskell how to use map to return a list?

我对如何返回数据类型中的某些内容的列表感到有些困惑。 我想我必须使用 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
  [ ]

Car类型与 Haskell 中专门用于Make数据类型的列表等效(数学家会使用术语isomorphic )。 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的第二个子句递归地构建一个正常的[]样式列表。 同样,重要的提示是“递归”和“ []样式列表”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM