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)
作为其第一个参数。
任何好主意或建议?
答案 0 :(得分:4)
如果你想以无点形式写addChar
,那就是:
addChar = (int2Char .) . (addMod26 `on` char2Int)
或者:
addChar = int2Char .: (addMod26 `on` char2Int)
(.:) = (.) . (.)
,其中包含二元函数的一元函数:
(.:) :: (c -> d) -> (a -> b -> c) -> a -> b -> d
您可以使用pointfree
工具发现这些重构,但结果往往很难看。