2012-11-20 27 views
6

は、私は、この関数を作りたいと言うことができます:ドット演算子

maxmin :: Ord a => a -> a -> a -> a 
maxmin a b c = max a (min b c) 

私は

にこれを改善することができます
maxmin a b = (max a) . (min b) 

しかし、aとbを取り除く方法はありますか?

+7

ポイントフリーはコード*スタイル*なので、読みやすさを向上させる場合にのみ使用してください。ポイントフリーの表​​記が(インライン展開のために)別々にコンパイルされるケースは、一般的に心配しなければならないものではありません(プロファイリング後に考えてください)。あなたの場合、私はポイントフリーでは役に立たないと言っています。 'maxmin'を' constrainTo'に改名することは、例えば表情豊かな変更になります。 – David

答えて

8

私は、これはsimplierで言わないだろうが、ここに行く:

maxmin :: Ord a => a -> a -> a -> a            
maxmin = (. min) . (.) . max 

lambdabothttp://www.haskell.org/haskellwiki/Pointfreeからplツールで生成)

lambdabot> pl maxmin a b c = max a (min b c) 
maxmin = (. min) . (.) . max 
3

をあなたはちょうどそのため"three laws of sections"を使用し、

したがって、

import Control.Arrow 

maxmin a b = (max a) . (min b) 
      = (.) (max a) (min b) 
      = uncurry (.) (max a, min b) 
      = uncurry (.) . (max *** min) $ (a, b) 
      = curry (uncurry (.) . (max *** min)) a b 

これもあまり読み込みができません。 :)