我有一个需要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函数的每个参数?这似乎是一个简单的构图问题,但我一直无法找到解决方案。
答案 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))