[英]In Julia, can one write what in Haskell terminology are called "sections?"
根據對 Haskell 的簡要介紹……
在 Haskell 中,中綴運算符的部分應用稱為節。
考慮 Haskell 表達式filter (\n -> n > 0) [-3,-4,5,6,-7,8]
,其計算結果為[5,6,8]
。
使用section ,這可以在 Haskell 中重寫為filter (>0) [-3,-4,5,6,-7,8]
。
在Julia中,可以編寫filter( n -> n > 0, [-3,-4,5,6,-7,8] )
。
可以使用等效的 Haskell 部分(>0)
在 Julia 中重寫這最后一個嗎?
以下產生語法錯誤......
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中,可以使用節和函數組合類似地重寫嗎?
不是在語法上,不是。 但是一些運算符具有部分應用“邏輯”參數的方法,其中包括 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, __)
對於您的第一個示例,您可以編寫:
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]
但是,是否為某些糖語法創建自定義函數是否是一個好主意將取決於您。 您最終可能希望編寫宏代碼來簡化此任務。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.