[英]Haskell/Frege <=< and =<< associativity
根據Hoogle的說法, <=<
(Kleisli monad組成,或“左魚”)和=<<
(反向monad bind)的infixr 1
是infixr 1
。 如果我正確地看着它們,就像說的那樣
print <=< return =<< return "foo"
應該是無效的,因為它等同於同樣無效的
print <=< (return =<< return "foo")
但由於某種原因,盡管第一個表達似乎在Haskell中無效,正如預期的那樣,Frege似乎沒有抱怨,並且在=<<
之前評估<=<
。
當我在pointfree.io上弄亂如何弄清楚如何制作類似的東西時,我發現了這一點
foo >>= (bar <=< baz)
沒有點,它給了我
bar <=< baz =<< foo
考慮到固定性,這看起來不太正確。
Frege 就像 Haskell,但Frege 不是 Haskell。 在弗雷格,這些算子的infixr 2
是不同的: =<<
是infixr 2
而<=<
是infixr 3
。 因此,由於<=<
具有較低的優先級, bar <=< baz =<< foo
自然被解析為(bar <=< baz) =<< foo
。
(事實上, =<<
和<=<
在弗雷格有不同的類型 ,而不是在Haskell中:不是Monad
約束,它們有一個Bind
約束,其中Bind
就像沒有pure
/ return
Monad
。)
是的, 弗雷格將自己描述為“一個Haskell的JVM”,但他們的意思是“ 一個 Haskell”在某種意義上說,Common Lisp是一個Lisp和計划是一個Lisp和Clojure是一個Lisp。 看到“Haskell”以這種方式使用是很奇怪的; 看到“JVM的類似Haskell的語言”或更強大的東西更為正常。 但弗雷格非常相似,我可以理解為什么。
另外,你說對了: 確實出現了一個錯誤pointfree
(即備份程序pointfree.io )! pointfree
應該生成Haskell代碼,而不是Frege,因此轉換無效的事實意味着它做錯了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.