3

我想编写一个 Haskell 函数,该函数采用具有 11 个字段的自定义类型,并返回所有字段值的列表,或将字段名称与其值相关联的映射。我不想显式地获取每个字段,因为那样会很冗长且通用性较差。有没有办法做到这一点?

4

1 回答 1

7

你写的东西在某种程度上是可能的,但它不会很有用。

假设我们暂时坚持编写这个函数。鉴于字段的值可能具有不同的类型,您可能更希望生成一个元组。IE

data MyType = MyType Int String Bool

getFields :: MyType -> (Int, String, Bool)
getFields (MyType a b c) = (a,b,c)

所以你现在可以这样称呼它

let v = MyType 1 "Hello" True
let (x, y, z) = getFields v

现在,这实际上并不是很有用,因为您可以在所有这些情况下使用模式匹配,例如

let v = MyType 1 "Hello" True
let (MyType x y z) = v

好的,但是如果您想处理单个字段怎么办?像

let x = fst (getFields v)

...如何在没有“getFields”功能的情况下做到这一点?好吧,您可以简单地分配字段名称(您可能已经这样做了):

data MyType = MyType
          { i :: Int
          , s :: String
          , b :: Bool
          }

现在您可以免费访问各个字段:

let x = i v

...因为为字段分配名称实际上会生成类似i :: MyType -> Intor的函数s :: MyType -> String

于 2013-05-30T20:25:41.813 回答