Точечный оператор в haskell с многопараметрическими функциями

Я хочу написать функцию без точек в haskell, для простоты скажем, я хочу сделать эту функцию:

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

Я могу улучшить это до

maxmin a b = (max a) . (min b)

но есть ли способ избавиться от а и б?

2 ответа

Решение

Я бы не сказал, что это проще, но здесь вы идете:

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

(Создано с pl инструмент из lambdabot http://www.haskell.org/haskellwiki/Pointfree)

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

что тоже не слишком читабельно.:)

Другие вопросы по тегам