【问题标题】:Does Julia have an operator similar to Haskell's dollar sign?Julia 是否有类似于 Haskell 的美元符号的运算符?
【发布时间】:2017-06-03 15:57:01
【问题描述】:

Haskell 的美元符号是一个很棒的函数,例如,对于 f $ gfg 的结果作为其参数进行评估。这可以像这样出色地工作

sin $ sqrt $ abs $ f 2

相当于

sin(sqrt(abs(f(2))))

美元符号对我来说很好,因为它更具可读性。我注意到 Julia 有 |> 哪些管道。这似乎是f |> g,这意味着gf 的评估结果作为参数。根据我的观察,我似乎可以这样写上述表达式

2 |> f |> abs |> sqrt |> sin

但我想知道是否有一些运算符可以让我做一些类似于我在 Haskell 中所做的事情。

【问题讨论】:

    标签: haskell julia


    【解决方案1】:

    现在不稳定的夜间版本有一个function composition operator(即将在 0.6 中)。它可以在带有Compat.jl 包的早期版本上使用。

    help?> ∘
    "∘" can be typed by \circ<tab>
    
      f ∘ g
    
      Compose functions: i.e. (f ∘ g)(args...) means f(g(args...)). The ∘ symbol can be
      entered in the Julia REPL (and most editors, appropriately configured) by typing
      \circ<tab>. Example:
    
      julia> map(uppercase∘hex, 250:255)
      6-element Array{String,1}:
       "FA"
       "FB"
       "FC"
       "FD"
       "FE"
       "FF"
    

    或者,以您的示例为例 - 请注意,您需要在此处使用括号:

    julia> (sin ∘ sqrt ∘ abs ∘ f)(2)
    0.9877659459927356
    

    【讨论】:

    • 请注意,在 Haskell 中,often be more idiomatic 会写成 sin . sqrt . abs $ f 2,其中 . 与 Julia 的 相同,因此它们更加相似 :-)
    • 或者他可以自己将其定义为权宜之计:∘(f::Function, g::Function) = (xs...) -&gt; f(g(xs...))。虽然不确定它在 Haskell 中是如何工作的,但请注意,您现在可以像这样定义一个新的复合匿名函数:h = f∘g。当我尝试在 Haskell 中没有输入的情况下执行 cos $ sin 时,出现错误。
    • @DNF 那是因为Haskell中的$是函数应用(f $ x = f x)而不是函数组合,写成f . g = \x -&gt; f (g x)
    【解决方案2】:

    可以在模块中本地定义$ 运算符(只要您不需要其已弃用的异或含义);

    f $ y = f(y)
    

    但是,这个运算符的结合性(它是左结合的)是不正确的,它的优先级太高而不能用于避免括号。幸运的是,有很多正确优先级的右结合运算符。可以定义

    f ← x = f(x)
    

    (单行定义,几乎是 Haskell 式的!)然后这样使用它:

    julia> sin ← π
    1.2246467991473532e-16
    
    julia> exp ← sin ← π
    1.0000000000000002
    
    julia> exp ∘ sin ← π
    1.0000000000000002
    

    【讨论】:

    • 这让我大吃一惊!我认为我们必须使用函数符号:←(f, y) = f(y)
    • 哇!这是一个很好的发现。
    • 哇,这太漂亮了!但是,使用字符有什么限制? (显然,f Q x = f(x) 不起作用。extra token "Q" after end of expression
    • @HarrisonGrodin 允许的运算符定义为here
    猜你喜欢
    • 2011-10-14
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 2016-03-29
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    相关资源
    最近更新 更多