Haskell函数返回任意数量的字段作为列表

时间:2013-05-30 20:10:43

标签: haskell custom-type

我想编写一个Haskell函数,该函数采用带有11个字段的自定义类型,并返回所有字段的列表'值或关联字段的地图'名称及其值。我不想明确地获得每一个领域,因为那将是冗长而且不那么通用的。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:7)

你所写的内容在某种程度上是可能的,但它不会非常有用。

让我们想象一下我们坚持写这个功能片刻。鉴于字段的值可能有不同的类型,您可能更愿意产生一个元组。即。

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 -> Ints :: MyType -> String等函数。