Ho chiesto questo domanda qualche tempo fa - le risposte erano davvero utili, e mentre le leggevo e le domande che erano collegate - ho anche visto this , e la prima risposta che penso si rivolge veramente a ciò che pensavo fosse l'essenza del più potente sistema di tipi.
Stavo cercando di capire veramente la pseudo-implementazione del functor che l'autore dà nel suo esempio - e mi chiedevo se qualcuno potesse darmi una spiegazione leggermente più semplice di questa parte della sua risposta.
Direttamente citato dalla risposta: sono questi bit che non riesco a ottenere.
per questo blocco di codice.
interface Functor<A> {
Functor<B> map(Function<A, B> f);
}
- The type system doesn't allow us to express the invariant that the map method always returns the same Functor subclass as the receiver.
- Therefore, there's no statically type-safe manner to invoke a non-Functor method on the result of map.
È un modo semplice per vedere che in un'implementazione concreta di Functor
, puoi dichiarare ciò che vuoi usare come A
, ma non quello che vuoi usare come B, o anche il B
è uguale su entrambi i lati della funzione mappa?
Più altro, la mia interpretazione un po 'semplicistica di questo è che i tipi single-type significano veramente che limita quanto lontano è possibile "raggiungere" o "specificare" il contratto che si sta tentando di specificare con i propri tipi. Con tipi di tipi più elevati, ottieni molta più flessibilità su come specifichi i tuoi tipi, cioè puoi vincolare e legare le tue funzioni in modo più specifico che puoi con semplici generici di java.
... o davvero potrei essere che non capisco cosa sia un Type Constructor o perché sia utile!