Точечный оператор в 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
что тоже не слишком читабельно.:)