Lo que quiere Parece que hay una composición de funciones binarios y unarios, como esto:
compose :: (c -> d) -> (a -> b -> c) -> (a -> b -> d)
compose unary binary a b = unary (binary a b)
y le pedirá una versión libre de puntos (sin mencionar de a
y b
las variables). Probemos y eliminemos uno por uno. Vamos a empezar con b
, usando el hecho de que f (g x) = f . g
:
compose unary binary a = unary . binary a
a
es el siguiente. Vamos a desugar la expresión primera:
compose unary binary a = ((.) unary) (binary a)
y aplicar la misma regla de composición de nuevo:
compose unary binary = ((.) unary) . binary
Esto se puede escribir más ampliamente como:
compose unary = (.) ((.) unary)
o incluso como
compose = (.) . (.)
Aquí, cada (.)
'quita' un argumento de la función binaria y necesita dos porque la función es binaria. Esta expresión es muy útil cuando se generaliza para cualquier functor: fmap . fmap
(tenga en cuenta que fmap
es equivalente a .
cuando la función se ve como un funtor). Esto le permite a la 'tira' cualquier funtor fuera, por ejemplo, puede escribir:
incrementResultsOfEveryFunctionInTwoDimentionalList :: [[String -> Integer]] -> [[String -> Integer]]
incrementResultsOfEveryFunctionInTwoDimentionalList = fmap . fmap . fmap $ (+1)
Por lo tanto, el resultado se convierte en:
(fmap . fmap) nub (++)
Editar:
Creo que he encontrado la respuesta que mi cerebro estaba tratando de reproducir: Haskell function composition operator of type (c→d) → (a→b→c) → (a→b→d)
Muy bien, gracias por la respuesta y la derivación. (¡Su última línea de derivación parece que puede estar en ruso !?) – guthrie
igual que '(nub.). (++) ' – user102008