Haskell/Frege <=< 和 =<< 结合性
Haskell/Frege <=< and =<< associativity
根据Hoogle,<=<
(Kleisli monad 组合,或"left fish")和=<<
(反向monad 绑定)的固定性是infixr 1
.如果我没看错的话,像 say
这样的表达式
print <=< return =<< return "foo"
应该是无效的,因为它等同于同样无效的
print <=< (return =<< return "foo")
但不知为何,虽然第一个表达式在Haskell中似乎是无效的,但正如预期的那样,弗雷格似乎毫无怨言,在=<<
之前计算了<=<
。
我在 pointfree.io 上闲逛时发现了这个,想弄清楚如何制作类似
的东西
foo >>= (bar <=< baz)
免分,给了我
bar <=< baz =<< foo
考虑到固定性,这看起来不太正确。
弗雷格喜欢Haskell,但弗雷格不Haskell。而在弗雷格那里,这些运算符的固定性是不同的:=<<
is infixr 2
and <=<
is infixr 3
。所以由于 <=<
具有较低的优先级, bar <=< baz =<< foo
自然被解析为 (bar <=< baz) =<< foo
.
(事实上,=<<
和 <=<
在 Frege 中的 类型 与在 Haskell 中的不同:而不是 Monad
约束,他们有一个 Bind
约束,其中 Bind
就像没有 pure
/return
的 Monad
。)
是的,Frege describes itself 和 "a Haskell for the JVM" 一样,但它们的意思是“a Haskell”,在 Common Lisp 是 Lisp 的意义上, Scheme 是 Lisp,Clojure 是 Lisp。看到以这种方式使用 "Haskell" 很奇怪;看到 "a Haskell-like language for the JVM" 或更强的东西会更正常。但弗雷格是如此相似,我明白为什么了。
此外,您是对的: 似乎是 pointfree
(the program that backs pointfree.io 中的错误)! pointfree
应该生成 Haskell 代码,而不是 Frege,所以该转换无效的事实意味着它做错了事。
根据Hoogle,<=<
(Kleisli monad 组合,或"left fish")和=<<
(反向monad 绑定)的固定性是infixr 1
.如果我没看错的话,像 say
print <=< return =<< return "foo"
应该是无效的,因为它等同于同样无效的
print <=< (return =<< return "foo")
但不知为何,虽然第一个表达式在Haskell中似乎是无效的,但正如预期的那样,弗雷格似乎毫无怨言,在=<<
之前计算了<=<
。
我在 pointfree.io 上闲逛时发现了这个,想弄清楚如何制作类似
的东西foo >>= (bar <=< baz)
免分,给了我
bar <=< baz =<< foo
考虑到固定性,这看起来不太正确。
弗雷格喜欢Haskell,但弗雷格不Haskell。而在弗雷格那里,这些运算符的固定性是不同的:=<<
is infixr 2
and <=<
is infixr 3
。所以由于 <=<
具有较低的优先级, bar <=< baz =<< foo
自然被解析为 (bar <=< baz) =<< foo
.
(事实上,=<<
和 <=<
在 Frege 中的 类型 与在 Haskell 中的不同:而不是 Monad
约束,他们有一个 Bind
约束,其中 Bind
就像没有 pure
/return
的 Monad
。)
是的,Frege describes itself 和 "a Haskell for the JVM" 一样,但它们的意思是“a Haskell”,在 Common Lisp 是 Lisp 的意义上, Scheme 是 Lisp,Clojure 是 Lisp。看到以这种方式使用 "Haskell" 很奇怪;看到 "a Haskell-like language for the JVM" 或更强的东西会更正常。但弗雷格是如此相似,我明白为什么了。
此外,您是对的: 似乎是 pointfree
(the program that backs pointfree.io 中的错误)! pointfree
应该生成 Haskell 代码,而不是 Frege,所以该转换无效的事实意味着它做错了事。