6

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を取り除く方法はありますか?

4

2 に答える 2

9

これがより簡単だとは言いませんが、ここに行きます:

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
于 2012-11-20T14:26:53.407 に答える
3

そのために「セクションの三法則」を使用するだけで、

(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

どちらも読みにくいです。:)

于 2012-11-20T16:05:08.103 に答える