【问题标题】:Mapping a type to a list in Haskell将类型映射到 Haskell 中的列表
【发布时间】:2014-05-12 20:51:06
【问题描述】:

我想将一个类型的新实例映射到一个列表的内容。 例如:

MyList = [1..10]
data MyType = MyType Int

map (MyType (\x -> x)) MyList

我想得到类似 [MyType, MyType ...] 的东西,其中每个 MyType Int 值都来自列表。 这不起作用,我该如何实现?还是有更好的办法?

谢谢!

edit:我忘了 MyType 更复杂,例如:

data MyType = MyType Int String Bool

那么,我怎样才能将列表中的整数映射到 MyType 的 Int 部分,保持其他值固定,如 MyType ...“test”True(这就是我想到 lambda 的原因)。

【问题讨论】:

  • 术语说明:在 Haskell 中,(类型类的)实例是类型,而不是值。因此,与其说“将类型的新实例映射到列表的内容”,不如说“从列表的内容中生成类型的值”,或者(理所当然的 Lee 的回答)“将构造函数映射到一个列表”。
  • @Manuel:你应该阅读 Haskell 的简要介绍。

标签: list haskell types map


【解决方案1】:

MyType 构造函数是一个函数Int -> MyType,所以你可以直接使用

let mapped = map MyType MyList

如果您有更复杂的类型,例如MyType Int String Bool 那么你可以这样做:

let mapped = map (\i -> MyType i "test" True) MyList

【讨论】:

  • 如果MyType定义为MyType Int String Bool,但我想保持String和Bool为固定值,例如:map MyType MyList "test" True ?
  • @Manuel map (\x -> MyList x "test" True) myList[MyList x "test" True | x <- myList]
  • 如此简单...非常感谢大家,我是haskell的新手,有时我会忘记一些细节...
【解决方案2】:

在编写data MyType = MyType Int 时,您正在声明一个类型 MyType with a single *constructor*MyTypewhich takes anIntand create an object of typeMyType`。

有时令人困惑的部分是,约定是在类型和构造函数只有一个时使用相同的名称 - 就像您所做的那样。你可以完美地写:

data MyType = MyConstructor Int

在这种情况下,正如@Lee 指出的那样,MyConstructorInt -> MyType 类型的函数,因此您可以将其作为 map 函数的第一个参数传递。

【讨论】:

    猜你喜欢
    • 2020-05-16
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 2019-10-12
    • 1970-01-01
    • 2020-05-02
    相关资源
    最近更新 更多