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