Julia の 無名関数をつなげて使う

Juliaで無名関数が使える

input

fnc = x -> x + 2
fnc(2)

output

4

無名関数をつなげて使う

この無名関数を連続して使うことができる. これが僕にとっては変な感じだった(たぶん無名関数を良く理解していないせい).

例えば

function f(x)
    x = 2x
    x += 5
end

みたいに「2倍して5足される」という関数を無名関数で次のように書くことができる.

gx = x -> (y -> y+5)(2x)
gx(3)

output

11

これで良いのか…

gxという関数は x を引数でとって 一番後ろの (2x) で2倍されて, それが y へ入って 5足される という感じみたい

f:id:mashiroyuya:20170922153329p:plain

処理は↑この画像の矢印の流れで行われるっぽい.

例 RungeKutta

この無名関数の書き方を使ってRungeKuttaを書くと

function rk4(f)
        return   (t,y,dt)-> 
               ( (dy1   )-> 
               ( (dy2   )-> 
               ( (dy3   )-> 
               ( (dy4   )->( dy1 + 2*dy2 + 2*dy3 + dy4 ) / 6 
               )( dt * f( t +dt  , y + dy3   ) )
               )( dt * f( t +dt/2, y + dy2/2 ) )
               )( dt * f( t +dt/2, y + dy1/2 ) )
               )( dt * f( t      , y         ) )
end

こうなるらしい.

出典

Runge-Kutta method - Rosetta Code
このサイト色々な言語でRungeKutta書いていて面白い.

最初何がなんだかわからなかったが, まあ理解すればすんなりわかった.

しかしパッと見でわからないから可読性が高いとは言えない気もする.