Confusion au sujet curryfication et le point de style libre dans Haskell
Question
Je suis en train de mettre en œuvre la fonction
every :: (a -> IO Bool) -> [a] -> IO Bool
qui a été le sujet pour
La solution La définition de $ est Soit de votre fonction parenthésée pleinement: et votre version cari: Comme vous l'avez remarqué, ce ne sont pas identiques. Vous ne pouvez arguments de la fonction drop arrière quand ils sont la dernière chose appliquée. Par exemple, est en fait et l'application de (g c) x vient en dernier, de sorte que vous pouvez écrire Un modèle avec l'opérateur d'application $ est qu'il devient souvent l'opérateur de composition. dans les versions points libres. En effet, est équivalent à Par exemple, peut devenir à quel point vous pouvez déposer xs: L'élimination du f argument est plus difficile, car il est appliqué avant que l'opérateur de composition. Utilisons la définition du point de http://www.haskell.org/haskellwiki/Pointfree : Avec des points, c'est et est exactement ce que nous devons faire tous les points sans pleinement: Malheureusement, en raison des restrictions du système de type Haskell, celui-ci a besoin d'une signature de type explicite: f $ x = f x
every f xs = (liftM (all id)) (sequence ((map f) xs))
every = (liftM (all id)) (sequence map)
f x = g c x
f x = (g c) x
f = g c
f $ g $ x
(f . g) $ x
every f xs = liftM (all id) $ sequence $ map f xs
every f xs = (liftM (all id) . sequence . map f) xs
every f = liftM (all id) . sequence . map f
dot = ((.) . (.))
(f `dot` g) x = f . g x
every = (liftM (all id) . sequence) `dot` map
every :: (Monad m) => (a -> m Bool) -> [a] -> m Bool