迷いませんか?

プログラミング、電子工作、ゲーム・・・etc、色々やるけど中途半端なブログです。

すごいH本 演習 13.6

本日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 = []

しっかりと型の宣言も見なおそうね!またいつか!