Julia中是否支持类似Haskell的section运算符偏应用写法?
基础偏应用section的等价写法
Julia没有照搬Haskell的(>0)形式的section语法,直接写(>0)会触发语法错误——因为Julia会把括号内的>0解析为缺少左操作数的不完整比较表达式,而非偏应用函数。
Julia本身的运算符就是普通的多参数函数,原生支持偏应用语法,完全可以实现和Haskell section完全等价的效果,写法更直接:
- 要实现Haskell中
(>0)(即n -> n > 0)的效果,直接写>(0)即可 - 对应示例代码的正确写法为:
filter(>(0), [-3,-4,5,6,-7,8]) # 求值结果为 [5,6,8],和Haskell版本完全一致
Julia中二元运算符op传入单个参数x得到的偏应用函数,逻辑为y -> op(y, x),刚好和Haskell中左section(op x)的语义完全对齐。比如:
(<=10)对应 Julia 里的<=(10),语义为y -> y <=10(== "test")对应 Julia 里的==("test"),语义为y -> y == "test"
如果要实现Haskell的右section(比如(0>)即n -> 0 > n),对应偏应用逻辑为y -> op(x, y),可以用Base.Fix1(op, x)实现,比如Base.Fix1(>, 0)就等价于(0>),语义为y -> 0 > y。
结合函数组合的简写支持
Julia原生支持函数组合,组合运算符为∘(输入时可在REPL/支持Julia语法的编辑器中敲\circ后按Tab键打出),语义和Haskell中的.完全一致:即(f ∘ g)(x) = f(g(x))。
注意:不要用
.替代∘做函数组合,.在Julia中是字段访问运算符,和函数组合语义完全不同,写错会触发逻辑错误或语法错误。
对应Haskell中filter ((>2).length) ...的写法,Julia可以直接写出逻辑完全等价的简洁代码:
filter(>(2) ∘ length, [[2,3], [5,7,11], [13], [17,19,23,29]]) # 求值结果为 [[5,7,11], [17,19,23,29]],和Haskell版本结果一致
这里的写法逻辑和Haskell完全对齐:先对传入的列表调用length求长度,再判断长度是否大于2,不需要手写完整的匿名函数,且不存在额外运行时开销。
内容的提问来源于stack exchange,提问作者user3134725

