Ci sono tre parti in questo tipo di firma:
- Corrente, tipo originale,
T
- Tipo di ritorno,
U
- Trasformazione,
f: (T) => U
Poiché stai guardando una classe generica con un metodo map
(anziché una funzione autonoma), la variabile di tipo T
è definita sopra, in una classe type signature: Try[T]
. Questo spiega perché non c'è T
nella parentesi di map[...]
. È già lì, non devi specificarlo di nuovo (e non puoi).
Quindi, semplicemente, la firma della classe Try[T]
fornisce un contesto sufficiente per consentire al compilatore di conoscere il tipo di sorgente.
In Haskell, hai a che fare con le funzioni, non con i metodi delle classi, quindi devi dichiarare gli input in modo esplicito. Non c'è this
o self
in Haskell.
In Scala, le lettere tra parentesi [T]
sono variabili di tipo dichiarazioni , mentre in (T) => U
diventano firme di tipi effettive. Onestamente, in casi come questo, penso che sarebbe sufficiente scrivere solo def map(f: (T) => U): Try[U]
(non notare parentesi dopo map
), ma non posso discutere con il compilatore. Devi solo dire al compilatore che userai U
nella seguente segnatura tipo.