Haskellでポイントフリーの関数を書きたいのですが、物事を簡単にするために、この関数を作りたいとしましょう:
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を取り除く方法はありますか?
Haskellでポイントフリーの関数を書きたいのですが、物事を簡単にするために、この関数を作りたいとしましょう:
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を取り除く方法はありますか?
これがより簡単だとは言いませんが、ここに行きます:
maxmin :: Ord a => a -> a -> a -> a
maxmin = (. min) . (.) . max
( http://www.haskell.org/haskellwiki/Pointfreepl
のツールで生成)lambdabot
lambdabot> pl maxmin a b c = max a (min b c)
maxmin = (. min) . (.) . max
そのために「セクションの三法則」を使用するだけで、
(a `op` b) = (a `op`) b = (`op` b) a = op a b
となることによって
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
どちらも読みにくいです。:)