Il caso generale di monad è espresso in Java 6? Notare le parole "caso generale" — potrebbe essere possibile che il caso generale di monade non sia esprimibile, sebbene molti casi particolari di monade (cioè molte monadi specifiche) siano espressi.Il caso generale di monad è espresso in java 6?
Il problema qui è (mancanza) Higher-kinded generics in Java; tuttavia, ho visto che il codice Haskell di esempio è stato effettivamente portato su Java utilizzando l'approccio come https://stackoverflow.com/a/877036/1123502 (ovvero, public class Fix<F extends Fix<F>>
).
Ovviamente, le implementazioni non di tipo sicuro (come l'utilizzo di Object e downcasts) non sono interessanti.
Aggiornamento: ci sono 2 definizioni di monade comuni: join-fmap e bind-return. Sebbene siano (matematicamente) equivalenti, potrebbero non essere equivalenti nel senso che una definizione è espressa in Java, mentre altri non lo sono (tuttavia, mi sembra, che la non equivalenza sia improbabile). Quindi la mia domanda riguarda entrambe le definizioni.
La linea di fondo: qualcuno ha superato tutti gli ostacoli e ha scritto monade "general case" in Java 6? Oppure, in alternativa, indica un foglio o un post completo sul blog o spiega dettagliatamente perché non è possibile.
Vedere anche [* Monads in Java *] (http://logicaltypes.blogspot.com/2011/09/monads-in-java.html). – trashgod
@trashgod Nota che in quell'implementazione il tipo restituito di 'bind' è' Monad '- non' M ', che non sarebbe possibile in Java. Di conseguenza, se hai una classe List che eredita da Monad, non c'è alcuna garanzia che chiamando 'bind' su tale lista produrrà un altro elenco, quindi non sarebbe legale scrivere qualcosa come' MonadicList stringhe = myMonadicList.bind (...) 'senza un cast. ... –
sepp2k
... Quindi la classe astratta fornita in quell'articolo non è un'implementazione completamente corretta del concetto di monade (anche se probabilmente è il più vicino a correggere come si può ottenere in Java). – sepp2k