如何在haskell中包装函数?

时间:2016-06-24 01:34:52

标签: haskell

addMod26 a b = (a + b) `mod` 26
char2Int c = ord c - (ord 'a')
int2Char i = chr (i + (ord 'a'))
addChar a b = int2Char ((addMod26 `on` char2Int) a b)

此代码尝试在add上实施char操作。它运作良好。但是函数addChar过于冗余。如何简化?

尝试写这样的

addChar = int2Char . (addMod26 `on` char2Int)

这是错的。 (.) :: (b -> c) -> (a -> b) -> a -> c无法接受(b -> b -> c)作为其第一个参数。

任何好主意或建议?

1 个答案:

答案 0 :(得分:4)

如果你想以无点形式写addChar,那就是:

addChar = (int2Char .) . (addMod26 `on` char2Int)

或者:

addChar = int2Char .: (addMod26 `on` char2Int)

(.:) = (.) . (.),其中包含二元函数的一元函数:

(.:) :: (c -> d) -> (a -> b -> c) -> a -> b -> d

您可以使用pointfree工具发现这些重构,但结果往往很难看。