2016-10-06 7 views
5

Laut Hoogle ist die Festigkeit von <=< (Kleisli Monad Zusammensetzung oder "linker Fisch") und =<< (umgekehrte Monade Bindung) infixr 1. Wenn ich bei ihnen richtig suchen, ein Ausdruck wie, sagtHaskell/Frege <= <und = << Assoziativität

print <=< return =<< return "foo" 

unwirksam sein, da es zu den ebenso ungültig

print <=< (return =<< return "foo") 

Aber aus irgendeinem Grunde gleichwertig war würde, obwohl die der erste Ausdruck scheint in Haskell ungültig zu sein, wie erwartet, scheint Frege keine Beschwerden zu haben und wertet <=< vor dem =<< aus.

ich erfahren, als ich auf pointfree.io rumgespielt um herauszufinden, wie so etwas wie

foo >>= (bar <=< baz) 

Punkt frei zu machen, und es gab mir

bar <=< baz =<< foo 

welche nicht sehen Sie richtig aus, in Anbetracht der Fixitäten.

Antwort

6

Frege ist wie Haskell, aber Frege ist nicht Haskell. Und in Frege sind die Fixitäten dieser Operatoren unterschiedlich: =<< is infixr 2 und <=< is infixr 3. Also, da <=< niedrigeren Vorrang hat, wird bar <=< baz =<< foo natürlich als (bar <=< baz) =<< foo geparst.

(In der Tat, =<< und <=< haben unterschiedliche Typen in Frege als sie in Haskell zu tun: anstelle einer Monad Einschränkung, sie haben eine Bind Einschränkung, wo Bind wie Monad ist ohne pure/return.)


Ja, Frege describes itself als "Haskell für die JVM", aber sie bedeuten "eine Haskell" in dem Sinne, dass Common Lisp ist ein Lisp und Scheme ist ein Lisp und Clojure ist ein Lisp. Es ist seltsam zu sehen, dass "Haskell" auf diese Weise benutzt wird; es wäre normaler, "eine Haskell-ähnliche Sprache für die JVM" oder etwas Stärkeres zu sehen. Aber Frege ist so ähnlich, dass ich sehen kann warum. Auch


, du hast Recht: dass tut erscheint ein Fehler in pointfree (das Programm, das sichert pointfree.io) zu sein! pointfree soll erzeugen Haskell Code, nicht Frege, so dass die Tatsache, dass diese Transformation ungültig ist bedeutet, dass es die falsche Sache macht.

+2

Die Typabweichung in Frege ist wahrscheinlich, weil die AMP (oder eine noch radikalere Monad-Klassenhierarchie) dort von Anfang an implementiert wurde, Jahre bevor sie in GHC durchgeführt wurde. Ich bitte Sie, zu prüfen, ob es fair ist, Frege das "Haskell-Eigentum" auf diesem Boden zu verweigern. In diesem starken Sinne wird kein Post-AMP-Haskell-Programm tatsächlich in Haskell geschrieben. Das macht keinen Sinn, IMHO. (Natürlich weiß ich, dass es andere Gründe gibt, Frege das volle Haskell-Schiff zu verweigern.) – Ingo

+0

@Ingo: Ich habe versucht zu sagen "Frege ist nicht Haskell, daher ist es nicht verwunderlich, dass es anders wäre; in der Tat ist es auf diese Weise anders."Mit anderen Worten, ich würde die Kausalität umgekehrt stellen :-) Der Kommentar" Haskell-Eigenschaft "war ein Kommentar zum Gebrauch in englischer Sprache: Frege ist die einzige Sprache, die ich als" Haskell "beschrieben habe Eine ungewöhnliche Art, es zu beschreiben, und ich dachte, dass es wichtig sei, sie als mögliche Quelle der Verwirrung zu bezeichnen –

+1

Ich muss zugeben, dass ich nicht 100% glücklich mit dem Slogan "Haskell for JVM" bin, das ist ein Grund Deshalb habe ich eigentlich einen anderen Namen gewählt, aber SPJ selbst hat uns ermutigt, in dieser Hinsicht beleidigender zu sein und die (noch bestehenden) Unterschiede als vernachlässigbar zu verwerfen. Ich stimme auch zu, dass das "a" vielleicht ein bisschen ist störend. – Ingo