【问题标题】:Haskell how to use map to return a list?Haskell如何使用map返回一个列表?
【发布时间】:2015-09-27 04:54:30
【问题描述】:

我对如何返回数据类型中的某些内容有点困惑。我想我必须使用地图功能,但不确定如何在这种情况下使用它。例如,如果我有下面的数据类型(我知道很奇怪,但具体来说),我将如何编写一个函数

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

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

data Car = Model Make Car | Tail

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

【问题讨论】:

  • 这至少是我最近看到的第二个带有dictionary 标签但与字典无关的问题。我很好奇您是否对为什么会发生这种情况有任何见解。
  • 请不要编辑您的问题以删除基本信息,例如Car 的定义。我已恢复您的编辑。

标签: list haskell


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2020-01-22
    • 2015-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多