簡體   English   中英

在 Julia 中,可以寫出 Haskell 術語中所謂的“部分”嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM