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

Mik*_*ike 3 haskell custom-type

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

Fre*_*abe 7

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

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

data MyType = MyType Int String Bool

getFields :: MyType -> (Int, String, Bool)
getFields (MyType a b c) = (a,b,c)
Run Code Online (Sandbox Code Playgroud)

所以你现在可以称之为

let v = MyType 1 "Hello" True
let (x, y, z) = getFields v
Run Code Online (Sandbox Code Playgroud)

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

let v = MyType 1 "Hello" True
let (MyType x y z) = v
Run Code Online (Sandbox Code Playgroud)

好吧,但如果你想解决个别领域呢?喜欢

let x = fst (getFields v)
Run Code Online (Sandbox Code Playgroud)

...没有'getFields'功能怎么做?好吧,你可以简单地指定字段名称(正如你可能已经做过的那样):

data MyType = MyType
          { i :: Int
          , s :: String
          , b :: Bool
          }
Run Code Online (Sandbox Code Playgroud)

现在,您可以免费访问各个字段的功能:

let x = i v
Run Code Online (Sandbox Code Playgroud)

...因为分配名称ot字段实际上生成像i :: MyType -> Int或的函数s :: MyType -> String.