Haskell: che tipo vuoi?
Diverse cose sono fonte di meraviglia per chi si avvicina ad Haskell. Molti dei linguaggi di uso comune (Java, C, C++, perl, Python e simili) hanno una qualche forma di polimorfismo, che permette di applicare uno stesso metodo o funzione a tipi diversi, con un risultato che dipende dal tipo degli argomenti o dell'oggetto su cui viene invocato.
Ad esempio:1 + 3 => 4 "questo" + "quello" => "questoquello"
"a".clone() => una nuova stringa "a" connection.clone() => un nuovo oggetto di classe ConnectionIn perl esiste anche un tipo (limitato) di dipendenza inversa, in cui il tipo di risultato dipende non dagli argomenti, ma dal contesto in cui il metodo viene chiamato.
@a = localtime(); # list context # @a contiene ora una lista con secondi, minuti, ore etc., tipo ( 45, 42, 20, 24, 2, 109, 2, 82, 0 ) $a = localtime(); # scalar context # $a contiene ora la stringa "Tue Mar 24 20:44:07 2009"
In Haskell l'inferenza dei tipi fa sì che il tipo della funzione invocata dipende dalle informazioni che il type checker ricava dal contesto in cui viene chiamata.