【发布时间】:2015-10-07 17:44:41
【问题描述】:
我将以下数据类型定义为记录
data Config = Config
{ field1 :: String
, field2 :: String
, field3 :: String
}
我想遍历Config 的每个字段,应用一些函数String -> String,例如tail 并返回新的Config。
这样做的惯用方法是什么?最好没有繁重的第 3 方库。
【问题讨论】:
-
head函数返回一个Char。我是否正确理解您希望字段的类型根据提供的函数返回的内容而改变? -
uniplate 是一个轻量级的泛型库,可能很容易做到这一点。
-
@MichaelSteele 我的错,类似于
tail将返回相同的类型String。我已经更新了问题 -
在
tail的情况下,@leftroundabout 的答案是可以使用的。请注意,即使您正在寻找函数 Config -> Config,您也需要在 Config 的定义中添加一个类型变量(如@leftroundabout 的回答),以便fmap可以为您完成工作。跨度> -
你确定你没有通过类比来思考动态类型语言,这将是一个自然的事情。在 Haskell 中,这并非不可能,但通常数据结构的每个字段都代表不同类型的事物,因此使用不同的函数进行处理。您的结构的外观似乎建议使用字典或数组,在这种情况下 Data.Map 或 Array 可能更合适。