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

jke*_*len 0 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 ...
Run Code Online (Sandbox Code Playgroud)

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

let a = T.unpack ("blah" :: Text)
Run Code Online (Sandbox Code Playgroud)

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

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

Dan*_*ner 5

为了处理参数扩散,您可能会喜欢记录参数模式。这也使得在保持向后兼容性的同时公开具有相同名称的新 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))
Run Code Online (Sandbox Code Playgroud)