2016-10-06 27 views
5

Według Hoogle, stałość <=< (kompozycja monis Kleisli lub "lewa ryba") i =<< (odwrotne wiązanie monady) to infixr 1. Jeśli patrzę na nich prawidłowo, wyrazem jak, powiedzmyHaskell/Frege <= <i = << asocjatywność

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

powinny być nieważne, ponieważ to byłoby równoznaczne z równie nieprawidłową

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

Ale z jakiegoś powodu, choć Pierwsze wyrażenie wydaje się nieważne w Haskell, zgodnie z oczekiwaniami, wydaje się, że Frege nie ma żadnych skarg i ocenia <=< przed =<<.

odkryłam to kiedy bawić na pointfree.io aby dowiedzieć się, jak zrobić coś takiego

foo >>= (bar <=< baz) 

punkt wolny, i to dało mi

bar <=< baz =<< foo 

który nie robi wyglądają całkiem dobrze, biorąc pod uwagę utrwalenia.

Odpowiedz

6

Frege to podobnie jak Haskell, ale Frege to nie Haskell. W Fregie, mechanizmy tych operatorów są różne: =<< is infixr 2 i <=< is infixr 3. Ponieważ <=< ma niższy priorytet, bar <=< baz =<< foo jest w naturalny sposób analizowany jako (bar <=< baz) =<< foo.

(W rzeczywistości, =<< i <=< mają różne rodzaje w Frege niż robią w Haskell: zamiast Monad przymusu, mają Bind ograniczeń, gdzie Bind jest jak Monad bez pure/return.)


Tak, Frege describes itself jako "Haskell dla JVM", ale mają na myśli "się Haskell" w tym sensie, że Common Lisp jest Lisp, Scheme i jest Lisp i Clojure jest Lisp. To dziwne, że "Haskell" jest używany w ten sposób; byłoby bardziej normalne widzieć "język podobny do Haskella dla JVM" lub coś silniejszego. Ale Fregge jest tak podobny, że rozumiem dlaczego.


Ponadto, masz rację: że robi wydaje się być błąd w pointfree (program, który popiera pointfree.io)! pointfree ma generować kod Haskell, a nie Fregata, więc fakt, że ta transformacja jest nieważna, oznacza, że ​​robi się coś złego.

+2

Odmiana typu w Fregge jest prawdopodobnie spowodowana tym, że AMP (lub nawet bardziej radykalna hierarchia klas Monady) została zaimplementowana od samego początku, na wiele lat przed jej wykonaniem w GHC. Proszę uprzejmie, aby rozważyć, czy można odmówić Frege "własności Haskella" na tej podstawie. W tym silnym sensie żaden program Haskella po AMP nie jest napisany w Haskell. To nie ma sensu, IMHO. (Oczywiście, zdaję sobie sprawę, że istnieją inne powody, by odmówić Fregowi pełnego statku Haskell.) – Ingo

+0

@Ingo: Próbowałem powiedzieć: "Fregą nie jest Haskell, więc nie jest zaskakujące, że byłoby inaczej; w rzeczywistości jest inaczej."Innymi słowy, postawiłbym przyczynowość odwrotnie :-) Komentarz" Haskell property "był komentarzem na temat użycia języka angielskiego: Frege to jedyny język, jaki widziałem, opisany jako" Haskell ", więc to jest nietypowy sposób, aby to opisać, i pomyślałem, że to ważne, aby wywołać w nim potencjalne źródło nieporozumień.) –

+1

Muszę przyznać, że nie jestem w 100% zadowolony z sloganu "Haskell for JVM", to jest jeden z powodów dlaczego najpierw wybrałem inną nazwę, ale to właśnie SPJ zachęcił nas do bycia bardziej ofensywnymi w tym zakresie, odrzucając (wciąż istniejące) różnice jako nieznaczne. Zgadzam się również, że "a" może być trochę – Ingo