簡體   English   中英

Haskell / Frege <= <和= <<關聯性

[英]Haskell/Frege <=< and =<< associativity

根據Hoogle的說法, <=< (Kleisli monad組成,或“左魚”)和=<< (反向monad bind)的infixr 1infixr 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM