在《朱莉娅》中,我们能写出 haskell 术语中所谓的“部分”吗?

kokeuurv  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(174)

根据A Gentle Introduction to Haskell ......
在Haskell中,中缀算子的部分应用称为节。
考虑Haskell表达式filter (\n -> n > 0) [-3,-4,5,6,-7,8],其计算结果为[5,6,8]
使用***部分***,这可以在Haskell中重写为filter (>0) [-3,-4,5,6,-7,8]
在***Julia***中,可以写成filter( n -> n > 0, [-3,-4,5,6,-7,8] )
这最后一个能用Julia重写吗?使用 haskell 节(>0)的等价物?
下面的语句会产生语法错误...

filter( (>0), [-3,-4,5,6,-7,8] )
更新

此外,在 haskell 一个可以重写...
filter (\list -> length list > 2) [ [2,3], [5,7,11], [13], [17,19,23,29] ]
...作为...
filter ((>2).length) [ [2,3], [5,7,11], [13], [17,19,23,29] ]
在***Julia***中,是否可以使用节和函数组合进行类似的重写?

x3naxklr

x3naxklr1#

语法上没有。但是一些运算符有部分应用“逻辑”参数的方法,其中包括来自Base的所有比较运算符:

julia> >(0)
(::Base.Fix2{typeof(>), Int64}) (generic function with 1 method)

julia> filter(>(0), [-3,-4,5,6,-7,8])
3-element Vector{Int64}:
 5
 6
 8

然而,人们可以自由地编写实现一些语法技巧的宏。例如,从Underscores.jl

@_ people |> filter(_.age > 40, __) |> map(_.name, __)
iyfamqjs

iyfamqjs2#

对于第一个示例,您可以编写:

julia> filter(>(0), [-3,-4,5,6,-7,8])
3-element Vector{Int64}:
 5
 6
 8

这是因为根据帮助:

julia> ?
help?> >
>(x)

  Create a function that compares its argument to x using >, i.e. a function equivalent to y -> y > x. The returned function is of type Base.Fix2{typeof(>)}, which can be used to implement specialized methods.

  │ Julia 1.2
  │
  │  This functionality requires at least Julia 1.2.

因此,如果您希望在第二个示例中使用类似的函数,则可能需要为自己定义一个类似的函数,如下所示:

julia> length_sup(x) = y -> length(y) > x
length_sup (generic function with 1 method)

然后你可以做:

julia> filter(length_sup(2), [ [2,3], [5,7,11], [13], [17,19,23,29] ])
2-element Vector{Vector{Int64}}:
 [5, 7, 11]
 [17, 19, 23, 29]

然而,是否为一些简单的语法创建自定义函数是一个好主意将取决于您。您可能最终希望编写宏来简化此任务。

相关问题