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

このコードでは、charadd操作を実装しようとしています。それはうまくいく。しかし、機能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 

これらのリファクタリングは、pointfreeツールですが、その結果は醜い傾向があります。

+0

ありがとうございます!私は '': ''のような関数を ''(。:) f g a b = f(g a b) 'という形で追加しましたが、あなたの解答はより良く、' ':' 'は鮮明です。 – liuyang1

関連する問題