2017-01-19 7 views
4

ハスケルのドル記号は、f $ gの場合、fなどの結果がgの引数で評価されるという素晴らしい機能です。これは見事にそれがより読みやすいので、ドル記号は、私にはいいですジュリアは、ハスケルのドル記号に似た演算子を持っていますか?

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

に相当し、この

sin $ sqrt $ abs $ f 2 

のように動作することができます。私はJuliaにどのパイプラインが|>あることに気づいた。これは、f |> gのようになり、gは、評価結果がfであることを意味します。私が気づいたものから、私がこの

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

のような上記の式を書くことができているようです。しかし、私は、私はHaskellで何をしたかのような何かができるように、いくつかのオペレータがあった場合、私は思っていました。

答えて

15

一つはでローカル$演算子を定義することができますモジュール;

f $ y = f(y) 

しかし、この演算子の結合性は、(それが左結合される)間違っている、とその優先順位がブラケットを回避するために有用であるには高すぎます。幸いにも、正しい優先順位の右結合演算子がたくさんあります。 (

julia> sin ← π 
1.2246467991473532e-16 

julia> exp ← sin ← π 
1.0000000000000002 

julia> exp ∘ sin ← π 
1.0000000000000002 
+1

これは私を驚かせた!私は、関数の表記法 '←(f、y)= f(y)'を使わなければならないと考えました。 – DNF

+1

うわー!これはかなりの発見です。 –

+0

うわー、これは美しいです!しかし、使用する文字の制限はありますか? (明らかに 'f Q x = f(x)'は機能しません。「余分なトークン」Q「式の終わりの後」) –

15

今や不安定な夜間バージョン(間もなく0.6になる予定)にfunction composition operatorがあります。これは、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" 

それとも、あなたの例で - あなたが必要なことに注意してください、ここでカッコ:(あなたはXORのその非推奨の意味を必要としない限り)

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

をそして、Haskellで、それは、[多くの場合、より慣用的なこと]ことに注意してください:(!ほとんどHaskellの風、単一ラインの定義)一つは

f ← x = f(x) 

を定義し、これを使用することができますhttp://stackoverflow.com/q/3030675/237428)。 sqrt。 abs $ f 2'、 '' .''はJuliaの '∘'と同じですので、もっと似ています:-) –

+0

また、彼自身がストップギャップ解決策として定義することもできます:'○(f :: Function、 g :: Function)=(xs ...) - > f(g(xs ...)) 'となります。 Haskellでどのように動作するかは不明ですが、今度は 'h = f .g'のような新しい複合無名関数を定義することができます。私がHaskellで入力なしで 'cos $ sin'を実行しようとしたとき、私はエラーを受けました。 – DNF

+0

@DNFこれは、Haskellの '$'は 'fと書かれた関数の構成ではなく、関数のアプリケーション(' f $ x = f x')だからです。 g = \ x - > f(g x) 'である。 – Cubic

関連する問題