Ich versuche, die Reader-Monade mit scalaz so zu definieren:
%Vor%aber ich bekomme einen Compilerfehler:
%Vor%Warum ist das so?
Danke, Levi
Dieser Fehler ist ziemlich undurchsichtig, selbst nach Scalas Standards. Methodennamen, die mit =
enden, werden speziell behandelt - sie werden zuerst als normale Bezeichner betrachtet, und andernfalls werden sie zu einer Selbstzuweisung erweitert.
Wenn Sie die syntaktische Interpretation Ihres Programms nicht verstehen, ist es eine gute Idee, scalac -Xprint:parser
auszuführen, um zu sehen, was vor sich geht. In ähnlicher Weise können Sie -Xprint:typer
oder -Xprint:jvm
verwenden, um spätere Phasen der Programmumwandlung zu sehen.
Also, wie rufst du >>=
auf deinem Reader
an? Zuallererst müssen Sie das Argument Env
explizit an env
übergeben. Das resultierende Reader[Env, Env]
muss dann in ein MA[M[_], A]
konvertiert werden. Für einfache Typkonstruktoren ist die implizite Konvertierung MAs#ma
ausreichend. Allerdings muss der Konstruktor Reader
des Param-Typs teilweise angewendet werden. Dies bedeutet, dass er nicht abgeleitet werden kann und stattdessen eine spezifische implizite Konvertierung erforderlich ist.
Die Situation würde erheblich verbessert, wenn Adriaan jemals einen freien Nachmittag findet, um eine Vereinheitlichung höherer Ordnung für die Typkonstruktor-Inferenz zu implementieren. . :)
Bis dahin, hier ist dein Code. Ein paar weitere Kommentare sind inline.
%Vor%