【Arrow】トランポリンを使う【Kotlin】

wrongwrong163377.hatenablog.com
qiita.com

続きです。

Arrowとは

Kotlinで関数型プログラミングをするためのライブラリです。
以下の記事で知りました。
techblog.picappinc.jp

トランポリンの実装と使い方

GitHubに実装と使い方(相互再帰で奇偶判定)が上がっています。
github.com
github.com

導入方法

トランポリンのみを使う場合は、ideaのライブラリ追加→from mavenから「io.arrow-kt:arrow-free:0.8.1*1」を追加すれば導入完了です。
f:id:wrongwrongwrongwrong163377:20181224172512p:plain
f:id:wrongwrongwrongwrong163377:20181224172437p:plain

実装してみた

簡単な階乗を実装してみました。

import arrow.free.Trampoline
import arrow.free.TrampolineF
import arrow.free.map
import arrow.free.runT
import java.math.BigInteger

fun fact(n: Int): TrampolineF<BigInteger> = when(n < 2){
    true -> Trampoline.done(BigInteger.ONE)
    else -> Trampoline.defer { fact(n-1) }.map { x -> x * n.toBigInteger() }
}

fun main(){
    val x = fact(10000).runT()
    println(x)
}
実装の続き

トランポリン含め幾つかの末尾再帰アルゴリズムを実装したものをGitHubに上げています。
github.com

*1:執筆時点の最新版