Ho appena realizzato quanto può essere utile la piccola funzione on
.Come rendere Haskell calcolare il tipo polimorfico corretto?
Es:
orderByLength = sortBy (compare `on` length)
Ma purtroppo, i tipi inferiti può essere un po intuitivo.
Secondo la definizione stessa
f `on` g = \x y -> f (g x) (g y)
si potrebbe ad esempio sostituire
(==) `on` length
con
\x y -> (length x) == (length y)
Ma entrambi hanno diversi tipi!
Il primo ha [a] -> [a] -> Bool
mentre il secondo ha il tipo corretto più generico di [a] -> [b] -> Bool
.
Questo non consente ovviamente termini corretti come (on (==) length) [1, 2, 3] ["a", "b", "c"]
(che dovrebbe produrre True
ma ora non riesce nemmeno il controllo dei tipi).
So che questa limitazione si presenta a causa dell'uso di first-rank types, ma come superare questo? Qualcuno può formulare un'implementazione di on
che possa gestire correttamente le funzioni polimorfiche (usando quantificazione universale/tipi di rango-n)?
cosa Cool - Che cosa è 'C'? Un tipo '* -> *'? Ah, è per avvolgere il potenziale uso di '[tipo]' ... Puoi generalizzarlo per qualsiasi * tipo *? – Dario
Fantastico, grazie per entrambe le idee – Dario