如何将函数应用于另一个函数的每个参数?

时间:2016-08-15 16:07:47

标签: haskell

我有一个需要10 String个参数的函数,在一些重构过程中,部分代码已经改变,所以现在这些参数在调用函数时最终为Text

fxn :: String -> ... -> IO (Int, String)
fxn a b c d e f g h i j = do something 

...

-- Get parameters for fxn
let a = "blah" :: Text
...
fxn a b c ...

理想情况下,我可以重构所有代码以使用Text,但目前这是乏味且不理想的。我还可以轻松地将T.unpack添加到我获取函数参数的位置:

let a = T.unpack ("blah" :: Text)

但同样,这是不理想的,因为这发生在大量参数的几个不同的地方,我宁愿保持代码更清洁,而不是到处都有几十个T.unpack语句。

haskell中是否有一种方法可以组合函数以使参数变形,例如(fxn . T.unpack) a b c ...,或者将unpack函数应用于f函数的每个参数?这似乎是一个简单的构图问题,但我一直无法找到解决方案。

1 个答案:

答案 0 :(得分:4)

为了处理参数扩散,您可能喜欢record parameter模式。这样也可以方便地公开具有相同名称的新API,同时保持向后兼容性。

对于问题,通常最简单的定义这样的短适配器:

fxnNew :: Text -> ... -> IO (Int, Text)
fxnNew = ...

fxn :: String -> ... -> IO (Int, String)
fxn a ... i = fmap (fmap T.unpack) (fxnNew (T.pack a) ... (T.pack i))