本日3度めの投稿
しかたないじゃん、書きたいことがたくさん出来たんだから
すごいH本を読んでたら時々”これは読者への演習問題とします”的なのがある
だけどあまり取り組んでなかったので取り組んでみた
モナドむずいらしいし
まず基本的なin3とかの関数はできてる状態
ここでもともとのcanReachIn3にある(6,2)->(6,1),(6,2)->(7,3)
の2つを試してみることにした
とりあえず当てずっぽうにコードを書いてみる
canReachIn3 :: KnightPos -> KnightPos -> [KnightPos] canReachIn3 start end | end `elem` in3 start = do | otherwise = []
これで枠組みはできた感じだと思って成功する場合を考えてみる
ここで成功した時の情報の保持方法わかんねwwwどうしよwww
とかなってたけど普通に非決定性計算を行ってガードすればオーケーだとおもう
なので
~~ = do x <- return start y <- moveKnight x z <- moveKnight y a <- moveKnight z guard (a == end) return [x,y,z,a]
成功したと思ってたんですが
ghciからロードするとずらずらーーっとエラーが出て来て小少数の一名の方が混乱の渦に
??????????
とりあえずモナド的にghciでやってみるか
return (6,2) >>= \x -> moveKnight x >>= \y -> moveKnight y >>= \z -> moveKnight z >>= \a -> guard (a == (6,1)) >> return [x,y,z,a]
パースエラー!!
ああ、そうだった最初のを括弧で囲わなくちゃ
そして実行すると・・・成功!
これで経験が少ない僕はさらに混乱が深まる
うーん・・・return外すとどうなるんだ???
と、長い間考えて出てきた駄思い付きを実行してみる・・・
エラーが・・・おきない? なんてこった!何が起こったっていうんだい?
実行してみると
[(~~),(~~),(~~),(~~),. . .]
わかりにくい! 4つ区切りで答えになってるのはわかっても見にくいよ!
なんか前の方で使ってたgroupsOfを使ったらエラーが起きるしわけわかめ
そういや・・・ghciでやった時は・・・[[(~~),(~~),(~~),(~~)],. . .]ってなってたな・・・
・・・!?
returnやgroupsOfでリストのリストにできない!しかしghciでやると実行できる!
もう一度コードを見なおしてみよう!どこかに間違いがあるはずだ!!!
・・・あった!型の宣言で[KnightPos]になってた!これを直せば・・・成功!最高!
型エラーはめったにないって本に書いてたから勘違いしてました(責任転嫁)
とりあえず完成したコードはこちら
canReachIn3 :: KnightPos -> KnightPos -> [[KnightPos]] canReachIn3 start end | end `elem` in3 start = do x <- return start y <- moveKnight x z <- moveKnight y a <- moveKnight z guard (a == end) return [x,y,z,a] | otherwise = []
しっかりと型の宣言も見なおそうね!またいつか!