首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell/Frege <=<和=<<结合性

Haskell/Frege <=<和=<<结合性
EN

Stack Overflow用户
提问于 2016-10-06 14:32:29
回答 1查看 244关注 0票数 5

根据Hoogle的说法,<=< (Kleisli组合物,或称“左鱼”)和=<< (反向monad )的固定性是infixr 1。如果我没看错的话,比如说

代码语言:javascript
复制
print <=< return =<< return "foo"

应该是无效的,因为它相当于同样无效的

代码语言:javascript
复制
print <=< (return =<< return "foo")

但出于某种原因,虽然第一个表达式在Haskell中似乎是无效的,但正如预期的那样,Frege似乎没有抱怨,并在<=<之前对=<<进行了评估。

当我在pointfree.io上乱搞找出如何制作类似的东西时,我发现了这一点。

代码语言:javascript
复制
foo >>= (bar <=< baz)

没有积分,它给了我

代码语言:javascript
复制
bar <=< baz =<< foo

从固定的角度来看,这看上去不太对。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-06 16:23:02

弗雷奇就像哈斯克尔,但弗雷格不是哈斯克尔。在Frege中,这些算子的固定点是不同的:infixr 2infixr 3。因此,由于<=<的优先级较低,因此bar <=< baz =<< foo自然被解析为(bar <=< baz) =<< foo

(实际上,=<<<=<在Frege中的类型与在Haskell中的不同:它们没有Monad约束,而是有Bind约束,其中Bind类似于没有pure/returnMonad。)

是的,弗雷格是“JVM的Haskell”,但它们的意思是“一个Haskell”,即Common是Lisp,Scheme是Lisp,Clojure是Lisp。以这种方式使用"Haskell“是很奇怪的;看到”用于JVM的类似Haskell的语言“或其他更强的语言会更正常。但弗雷格是如此的相似,我能理解为什么。

而且,您也是对的:这似乎是pointfree (支持pointfree.io的程序)中的一个bug!pointfree应该生成Haskell代码,而不是Frege,所以转换无效的事实意味着它做了错误的事情。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39898771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档