PDA

Visualizza la versione completa : [HASKELL] Tipo di una funzione


Neptune
12-10-2011, 12:16
Sinceramente non so se in questo forum esiste qualcuno che abbia mai programmato in Haskell, ma ci provo ugualmente.

Non riesco a capire perchè a questa funzione:

multxyz = x∗y∗z

è associato questo tipo:

mult :: Int -> (Int -> (Int -> Int))

quando nella descrizione sul libro di Haskell dice che questa funzione non fa altro che fare il prodotto di quei tre numeri acquisendo i numeri uno ad uno.

Cioè matematicamente non dovrebbe essere un dominio del tipo INTxINTxINT -> INT ? perchè Haskell lo descrive in quella forma strana li?

Vi ringrazio in anticipo per qualsiasi aiuto,
Neptune.

toraz
12-10-2011, 13:39
Originariamente inviato da Neptune
perchè Haskell lo descrive in quella forma strana li?

Currying (http://www.haskell.org/haskellwiki/Currying).

Neptune
12-10-2011, 19:13
Originariamente inviato da toraz
Currying (http://www.haskell.org/haskellwiki/Currying).

Cioè detto in pratica significa prendo 3 int e restituisco un int, che poi dice che è un forma "non molto corretta" però alla fine dei giochi è quello che fa, o no?

E si dovrebbe leggere tutto da sinistra verso destra, no?

Cioè se ho: int -> int -> int -> float

Significa che prendo 3 int e ritorno un float? Perchè dirlo in questa maniera è scorretto non lo capisco bene però.

toraz
13-10-2011, 13:45
Originariamente inviato da Neptune
Cioè detto in pratica significa prendo 3 int e restituisco un int, che poi dice che è un forma "non molto corretta" però alla fine dei giochi è quello che fa, o no?

Non esattamente, se no non direbbe che non e` molto corretta. :)
Per essere precisi il tipo di una funzione andrebbe letto come lo hai scritto nel primo post, cioe`



Int -> ( Int -> (Int -> Float ))

ovvero una funzione che prende un solo parametro di tipo Int e restituisce una funzione di tipo Int -> (Int -> Float) che a sua volta e` una funzione che prende un parametro e restituisce una funzione di tipo Int -> Float.

Tutta questa roba serve per poter "partially apply" (http://haskell.org/haskellwiki/Partial_application) (scusami ma non mi viene i italiano... applicare parzialmente si dice?!?) una funzione.

Neptune
13-10-2011, 15:36
Originariamente inviato da toraz
Non esattamente, se no non direbbe che non e` molto corretta. :)
Per essere precisi il tipo di una funzione andrebbe letto come lo hai scritto nel primo post, cioe`



Int -> ( Int -> (Int -> Float ))

ovvero una funzione che prende un solo parametro di tipo Int e restituisce una funzione di tipo Int -> (Int -> Float) che a sua volta e` una funzione che prende un parametro e restituisce una funzione di tipo Int -> Float.

Tutta questa roba serve per poter "partially apply" (http://haskell.org/haskellwiki/Partial_application) (scusami ma non mi viene i italiano... applicare parzialmente si dice?!?) una funzione.

Nel senso che, se do il primo Int, ma poi non do il secondo, allora mi si ritorna in uscità una "funzione non computata" anzichè il risultato della computazione?

Cioè se io ho quella funzione del tipo A*B*C e fornisco solo A=5 l'interprete cosa mi restituisce? 5*B*C? e non mi da errore quindi?

Altra domanda, vedevo che per windows c'era un comodo ambientino da 14 mb, per MacOS mi ha già fatto scaricare un ambiente di sviluppo da 140 e passa mega e manco si fa installare perchè non ho XCode. Ma non esiste qualche ambientino pratico e veloce anche per macOs? tanto per quei piccoli programmini che andrò a fare..

Anche perchè mi servirebbe un ambiente il più possibile uguale a quello di windows per non trovarmi poi spiazzato durante l'esame di laboratorio. Se non c'è mi toccherà emulare windows per far andare l'emulatore :D

toraz
13-10-2011, 16:11
Originariamente inviato da Neptune
Nel senso che, se do il primo Int, ma poi non do il secondo, allora mi si ritorna in uscità una "funzione non computata" anzichè il risultato della computazione?

Cioè se io ho quella funzione del tipo A*B*C e fornisco solo A=5 l'interprete cosa mi restituisce? 5*B*C? e non mi da errore quindi?

Grosso modo l'idea e` quella. I link che ho postato spiegano la questione abbastanza bene.




Altra domanda, vedevo che per windows c'era un comodo ambientino da 14 mb, per MacOS mi ha già fatto scaricare un ambiente di sviluppo da 140 e passa mega e manco si fa installare perchè non ho XCode. Ma non esiste qualche ambientino pratico e veloce anche per macOs? tanto per quei piccoli programmini che andrò a fare..

Anche perchè mi servirebbe un ambiente il più possibile uguale a quello di windows per non trovarmi poi spiazzato durante l'esame di laboratorio. Se non c'è mi toccherà emulare windows per far andare l'emulatore :D
Immagino che l'ambientino sia Hugs, nel caso c'e` anche per MacOS (http://www.haskell.org/haskellwiki/Mac_OS_X#HUGS) .

Neptune
14-10-2011, 23:36
Originariamente inviato da toraz
Grosso modo l'idea e` quella. I link che ho postato spiegano la questione abbastanza bene.



Immagino che l'ambientino sia Hugs, nel caso c'e` anche per MacOS (http://www.haskell.org/haskellwiki/Mac_OS_X#HUGS) .

Si mi serve HUGS per MacOs (e non tutto quel casino di ambiente con Xcode ecc ecc), ma non lo riesco a scaricare nè dal sito di Haskell nè dal sito che mi hai dato tu. Non è che potrsti linkarmi direttamente il file da scaricare? ci sto impazzendo, altrimenti mi tocca falro girare su windows virtualizzato ed è una bella rottura.

toraz
15-10-2011, 12:03
Non credo ci sia un link diretto da darti. Per quanto ne so di Mac OS i Macports sono un sistema tipo ports di BSD. Immagino che dovrai installare tutto l'albero dei pacchetti e poi compilare quello che ti serve. In alternativa puoi compilarlo a manella, i sorgenti li trovi su http://www.haskell.org/hugs/. Non dovrebbe avere troppe dipendenze.

Comunque sia, l'ambiente incasinato e` la Haskell Platform (http://hackage.haskell.org/platform/)?

Loading