2017-01-19 1 views
4

Знак доллара Haskell - замечательная функция, которая для f $ g, например, f оценивается по результатам g в качестве аргумента. Это может работать блестяще, как этотУ Джулии есть оператор, похожий на знак доллара Хаскелла?

sin $ sqrt $ abs $ f 2 

что эквивалентно

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

Знак доллара это хорошо для меня, потому что это более читаемым. Я заметил, что у Джулии есть |>, какие трубопроводы. Кажется, это делает f |> g, что означает, что g оценивает результат f как аргумент. Из того, что я заметил, это, кажется, что я мог бы написать вышеупомянутое выражение, как этот

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

Но мне было интересно, если есть какой-то оператор такой, что я мог бы сделать что-то вроде того, что я сделал в Haskell.

ответ

15

можно определить оператор $ (до тех пор, пока вы не нуждаетесь в ее устаревшее значение XOR) локально в модуль;

f $ y = f(y) 

Однако ассоциативность этого оператора (он остается ассоциативная) неверна, и его преимущество является слишком высоким, чтобы быть полезными для избежания скобок. К счастью, существует множество право-ассоциативных операторов с правом приоритета. Можно было бы определить

f ← x = f(x) 

(одно определение линии, почти Haskell-эск!), А затем использовать его таким образом:

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

В настоящее время существует 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 
+0

И обратите внимание, что в Haskell, было бы [часто более идиоматических] (http://stackoverflow.com/q/3030675/237428), чтобы написать 'sin. sqrt. abs $ f 2', где '.' - это то же самое, что и у Джулии' ∘', поэтому они еще более похожи :-) –

+0

Или он может просто определить это сам как стоп-решение: '∘ (f :: Функция, g :: Function) = (xs ...) -> f (g (xs ...)) '. Хотя вы не знаете, как это работает в Haskell, обратите внимание, что теперь вы можете определить новую составную анонимную функцию следующим образом: 'h = f∘g'. Когда я пытался сделать 'cos $ sin' без ввода в Haskell, у меня была ошибка. – DNF

+0

@DNF это потому, что '$' в Haskell является функциональным приложением ('f $ x = f x'), а не функцией композиции, которая написана как' f. g = \ x -> f (g x) '. – Cubic

Смежные вопросы