関数型言語の学習をしようと思ったのですがいいネタがなくて...
(結局PPAPに...)
関数型言語
考え方はこちらを参考に
関数型プログラミングはまず考え方から理解しよう
ちょっと自分には難しかったですw
とりあえず実装&実行
import java.util.*
val ppap = listOf("I have a ✏️", "I have a 🍍", "I have an 🍎", "I have a ✏️")
fun getPPAP(count : Int) : String {
println(ppap[count])
return ppap[count]
}
fun compile() {
var list = mutableListOf("")
while(true) {
list.add(getPPAP(Math.abs(Random().nextInt() % 3)))
if( list.takeLast(4).equals(ppap) ) {
println("PEN_PINEAPPLE✏️🍍 , APPLE_PEN✏️🍎")
break
}
}
}
compile()
これを関数型といっていいのかはわかりませんが....
オブジェクト指向を出るのをめざしてw
list
val ppap = listOf("I have a ✏️", "I have a 🍍", "I have an 🍎", "I have a ✏️"
ペンは使い回すので1つでいいかなと思ったんですが、後々つかうので、4つ定義しました
getPPAP
fun getPPAP(count : Int) : String {
println(ppap[count])
return ppap[count]
}
そのままですね
メソッド内でメンバー変数を変更すると関数型じゃないそうなので...メンバー変数の参照だけ
compile
fun compile() {
var list = mutableListOf("")
while(true) {
list.add(getPPAP(Math.abs(Random().nextInt() % 3)))
if( list.takeLast(4).equals(ppap) ) {
println("PEN_PINEAPPLE✏️🍍 , APPLE_PEN✏️🍎")
break
}
}
}
空のlist作って、addしていってます
(乱数は、0~2の間で出力します。マイナスも来るので絶対値にします)
最後から4つを調べて、PPAPだったら終了です
この終了の判断を簡単にするために、上のようなppaplistを作りました
結果
I have a ✏️
I have an 🍎
I have an 🍎
I have an 🍎
I have a 🍍
I have a 🍍
I have a ✏️
I have a ✏️
I have a ✏️
I have a 🍍
I have an 🍎
I have a ✏️
PEN_PINEAPPLE✏️🍍 , APPLE_PEN✏️🍎
[Finished in 3.1s]
ふむ!いい感じ
レベルアップ
import java.util.*
Random().let {
val ppap = listOf("✏️", "🍍", "🍎", "✏️")
generateSequence { ppap[Math.abs(it.nextInt() % 3)] }
.fold(mutableListOf(""), { a, b ->
println("I have " + (if (b.equals("🍎")) "an " else "a ") + b)
a.add(b)
if (a.takeLast(4).equals(ppap)) {
println(ppap.reduce { a, b -> a + b })
return@let
}
a
})
}
generateSequence
簡単にいうと次の値を渡してくれますw
今回は、「papp[(乱数)]
をどんどん渡して行く」という感じです
fold
イメージは引数付きのreduce
です
fold(mutableListOf(""), { a, b -> a}
今回のをわかりやすくするとこんな感じです
初期値で空listmutableListOf("")
を渡しています
その空listが引数a
に渡されます
引数b
には先ほどのpapp[(乱数)]
の文字が渡されます
返り値として、最後にa
を渡してあげます
三項演算子
javaで使いやすかった三項演算子がKotlinにはないらしく引っかかりました
b.equals("🍎") ? "an " : "a "
// b = "🍎" -> an
// b != "🍎" -> a
Kotlinは、ifが式なので、三項演算子はないとのこと....
if (b.equals("🍎")) "an " else "a "
終了
if (a.takeLast(4).equals(ppap)) {
println(ppap.reduce { a, b -> a + b })
return@let
}
return@let
でRandom().let
に戻り終了します
感想
レベルアップは、一旦コードを参考にさせてもらって、理解する方法をとりました
結局調べてもRandom().let{}
のlet
がわからなかったですw
もしかしたら、理解のミスがあるかもしれないけれど、処理は追うことができたのでよかったです