2010-12-29 18 views
6

estaba leyendo here, y dio cuenta de que, por ejemplo, si tengo las siguientes definiciones de las funciones:composición función genérica en Haskell

a :: Integer->Integer->Integer 
b :: Integer->Bool 

La siguiente expresión es inválida:

(b . a) 2 3 

Es bastante extraño que las funciones de la composición solo tengan un parámetro.

¿Es esta restricción debido a algún problema al definir la más genérica en Haskell o por algún otro motivo?

Soy nuevo en Haskell, así que estoy haciendo preguntas tal vez inútiles.

Respuesta

7

Cuando hace a 2 3, no está aplicando a a 2 argumentos. En realidad, estás aplicando a a su único argumento, lo que da como resultado una función, luego tomas esa función y la aplicas a 3. Entonces realmente haces 2 aplicaciones. Por lo tanto, en cierto sentido, lo que tiene no es equivalente a esto:

a :: (Integer, Integer) -> Integer 
b :: Integer -> Integer 
(b . a) (2, 3) 

Podrías haber hecho esto, por cierto

(b . a 2) 3 
+0

Oh, eso está bien y tiene sentido. ¡Gracias! – hsknew

+0

Y si a tiene Entero-> Entero-> Entero-> Entero, ¿cómo podría establecer el tercer parámetro y dejar las otras dos 'variable'? – hsknew

+0

Puedes hacer '(b. A 1 2) 3', por ejemplo. El punto es que la "cosa" producida por "a" tiene que estar en el dominio de "b" (o más o menos, del mismo tipo) – Phil

Cuestiones relacionadas