2010-12-29 16 views
6

mi leggeva here, e ho notato che, per esempio, se ho le seguenti definizioni di funzione:generica composizione funzione in Haskell

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

La seguente espressione è valida:

(b . a) 2 3 

È piuttosto strano che le funzioni della composizione debbano avere un solo parametro.

Questa restrizione è dovuta a qualche problema nella definizione del più generico in Haskell o per altri motivi?

Sono nuovo di Haskell, quindi sto facendo domande forse inutili.

risposta

7

Quando si esegue a 2 3, non si sta applicando a a 2 argomenti. In pratica stai applicando a al solo argomento, dando come risultato una funzione, quindi prendi quella funzione e applicala a 3. Quindi esegui effettivamente 2 applicazioni. Quindi, in un certo senso, quello che hai non è equivalente a questo:

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

Si potrebbe aver fatto questo, btw

(b . a 2) 3 
+0

Oh, che è fresco e ha un senso. Grazie! – hsknew

+0

E se un numero intero-> intero-> intero-> intero, come potrei impostare il terzo parametro e lasciare le altre due 'variabili'? – hsknew

+0

Si può fare '(b a 1 2) 3', per esempio. Il punto è che la 'cosa' prodotta da 'a' deve essere nel dominio' b' (o, grosso modo, dello stesso tipo) – Phil