我想编写一个 Haskell 函数,该函数采用具有 11 个字段的自定义类型,并返回所有字段值的列表,或将字段名称与其值相关联的映射。我不想必须显式地获取每个字段,因为那样会很冗长而且不太通用。有什么办法吗?
最佳答案
你写的东西在某种程度上是可能的,但不会很有用。
让我们假设我们坚持要写这个函数一会儿。鉴于字段的值可能有不同的类型,您可能更愿意生成一个元组。即
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
的函数。
关于返回任意数量的字段作为列表的 Haskell 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16845057/