2016-06-24 110 views
3
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) 

此代碼嘗試在char上執行add操作。它運作良好。但功能addChar太冗餘。如何簡化它?如何在haskell中封裝函數?

嘗試寫這樣

addChar = int2Char . (addMod26 `on` char2Int) 

這是錯誤的。 (.) :: (b -> c) -> (a -> b) -> a -> c不能接受(b -> b -> c),因爲它是第一個參數。

任何好主意,或建議?

回答

4

如果你想要寫在自由點形式addChar,這將是:

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

或者:

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

(.:) = (.) . (.),組成一個一元函數與二元函數:

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

您可以使用發現這些重構工具,雖然其結果往往是醜陋的。

+0

謝謝!我通過這種風格'(。:) f g a b = f(g a b)'添加了一個像'。:'這樣的函數,但是你的解決方案更好,'。:'很生動。 – liuyang1