F#で魔法陣問題

F#を初めて学ぶため、魔法陣問題に取り組みました。

先にC#でプログラムを組み、それをF#で同じように書くという手順。

 

作った関数

C#で作った関数は以下の3つ。

jun:順列を作る再帰関数
isValidCombination:配列が魔法陣の条件を満たすか
displayList:配列の中身の表示

関数名がひどいですが、自分の力量に合ったレベルの名前なのでよしとします。

junで順列を作っていき、isValidCombinationで条件を満たしていれば、displayListで中身を表示といった流れです。

これをF#で同じように書く、という手順でやりました。



その中で、isValidCombinationの部分。

C#では、

return
    numList[0] + numList[1] + numList[2] == 15 &&
    numList[3] + numList[4] + numList[5] == 15 &&
    numList[6] + numList[7] + numList[8] == 15 &&
...
    numList[2] + numList[4] + numList[6] == 15;

といった感じでtrue/falseを返していたのですが(これもだいぶひどい)、それがF#だとこんなかんじに。

module valid =
    let isValidCombination =
        if (numberList.[0] + numberList.[1] + numberList.[2] = 15 &&
            numberList.[3] + numberList.[4] + numberList.[5] = 15 &&
            numberList.[6] + numberList.[7] + numberList.[8] = 15 &&
            numberList.[0] + numberList.[3] + numberList.[6] = 15 &&
            numberList.[1] + numberList.[4] + numberList.[7] = 15 &&
            numberList.[2] + numberList.[5] + numberList.[8] = 15 &&
            numberList.[0] + numberList.[4] + numberList.[8] = 15 &&
            numberList.[2] + numberList.[4] + numberList.[6] = 15) then
                true
        else
                
                false

F#だとreturnとかがないので、いまいちどれを返すのかがよくわからない。

そして全体を書き上げて実行しても一向に終わる気配がなく、何も表示されないコンソールが残るのみ。

ビルド時のエラーも表示されず、しばらく途方に暮れていたわけですが、よく見るとこれが原因でした。

    let isValidCombination =

括弧抜けてるだけ。

でも括弧の有無だけで全然結果が違う。





ということで、非常に初歩的なミスでした。

ただ、結局F#の関数の返り値の書き方もよく分からないままなので、そのあたりも調べておきたいですね。