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#の関数の返り値の書き方もよく分からないままなので、そのあたりも調べておきたいですね。