3 桁の数の積の中から最大の回文を見つける次の命令型コードを考えてみましょう (そうです、これは「[18 世紀の傑出した数学者] のプロジェクト」サイトの最初のタスクの 1 つです)。
curmax = 0
for i in range(999,100):
for j in range(999,100):
if ((i*j) < curmax): break
if (pal(i*j)):
curmax = i*j
break
print curmax
私は現在 Haskell を学んでいるので、私の質問は、これ (および、基本的には単純な反復よりも複雑なものを含む命令型構造、たとえば、中断、継続、一時変数など) を Haskellにどのように変換するのかということです。
私のバージョンは
maxpal i curmax
| i < 100 = curmax
| otherwise = maxpal (i-1) (innerloop 999)
where
innerloop j
| (j < 100) || (p < curmax) = curmax
| pal p = p
| otherwise = innerloop (j-1)
where p = i*j
main = print $ maxpal 999 0
しかし、これはまだ命令的な醜い町にいるようです。
では、そのような場合に FP スタイルで対処する方法について、アドバイスをいただけますか?