我想编写一个 Haskell 函数,该函数采用具有 11 个字段的自定义类型,并返回所有字段值的列表,或将字段名称与其值相关联的映射。我不想显式地获取每个字段,因为那样会很冗长且通用性较差。有没有办法做到这一点?
问问题
365 次
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 -> Int
or的函数s :: MyType -> String
。
于 2013-05-30T20:25:41.813 回答