2012-11-20 12 views
6

Chcę napisać funkcję punktu darmo w Haskell, aby zachować rzeczy proste, powiedzmy, że chcę, aby tę funkcję:Dot operatora w Haskell z Wieloparametrowa funkcjonuje

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

mogę poprawić to

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

ale czy jest jakiś sposób na pozbycie się aib?

+7

Bezokolicznik to kod * styl *, i jako taki powinien być używany tylko wtedy, gdy poprawia czytelność; przypadki, w których notacja punktowa kompiluje się w różny sposób (z powodu wstawiania) nie są czymś, o co należy się ogólnie martwić (pomyśl o tym po profilowaniu). W twoim przypadku powiedziałbym, że wolne od podpowiedzi nie pomaga; zmiana nazwy 'maxmin' na' constrainTo 'będzie na przykład o wiele bardziej wyrazistą zmianą. – David

Odpowiedz

8

Nie powiedziałbym, że jest to prostsze, ale tutaj przejść:

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

(Generated z pl narzędzia z lambdabothttp://www.haskell.org/haskellwiki/Pointfree)

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

Wystarczy użyć "three laws of sections" na to,

(a `op` b) = (a `op`) b = (`op` b) a = op a b 

dzięki czemu

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 

który również nie jest zbyt czytelny. :)