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.