如何迭代记录字段?

8
我将以下数据类型定义为记录:
data Config = Config
  { field1 :: String
  , field2 :: String
  , field3 :: String
  }

我想遍历Config的每个字段,应用一些函数 String -> String(例如tail),并返回新的Config

怎样写是符合惯用法的呢?最好不要使用重型第三方库。


2
“head”函数返回一个“Char”。我的理解是,您希望字段的类型根据提供的函数返回值而改变,这正确吗? - Michael Steele
1
uniplate是一个轻量级的泛型库,可以很容易地完成这个任务。 - jberryman
@MichaelSteele 我的错,应该是类似于 tail 的函数,它会返回相同类型的 String。我已经更新了问题。 - Filip van Hoft
tail的情况下,@leftroundabout的答案是要使用的答案。请注意,即使您正在寻找一个函数Config -> Config,您也需要向Config的定义添加一个类型变量(如@leftroundabout的答案中所示),以便fmap可以为您完成工作。 - ErikR
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Paul Johnson
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Filip van Hoft
1个回答

16

嗯,最好的方式可能是这样做

{-# LANGUAGE DeriveFunctor #-}

type Config = Config' String
data Config' a = Config
  { field1 :: a
  , field2 :: a
  , field3 :: a
  } deriving (Functor)

configHeads :: Config -> Config' Char
configHeads = fmap head

单向遍历可能是一种替代方案。 - Rein Henrichs
对于字符串来说,这似乎是显而易见的方法。不幸的是,在其他一些情况下,这种方法会阻碍优化实现。 - dfeuer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接