2016-06-24 5 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) 

Dieser Code versuchen add Operation auf char zu implementieren. Es funktioniert gut. Aber die Funktion addChar ist zu redundant. Wie vereinfacht man es?Wie funktioniert die Funktion in Haskell?

versuchen, wie dieser Es ist falsch

addChar = int2Char . (addMod26 `on` char2Int) 

zu schreiben. (.) :: (b -> c) -> (a -> b) -> a -> c kann nicht akzeptieren, da es das erste Argument ist.

keine gute Idee oder Anregung?

Antwort

4

Wenn Sie addChar in Punkt freier Form schreiben wollen, wäre es:

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

Oder:

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

Wo (.:) = (.) . (.), die eine einstellige Funktion mit einer binären Funktion komponiert:

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

Sie können diese Refactorings mit derentdeckenWerkzeug, obwohl seine Ergebnisse eher hässlich sind.

+0

Danke! Ich habe eine Funktion wie '.:' Mit diesem Stil '(. :) f g a b = f (g a b)' hinzugefügt, aber Ihre Lösung ist besser und '.:' Ist lebendig. – liuyang1