私は Haskll を学ぼうとしているので、Haskell で Project Euler の質問 26 を試していました: http://projecteuler.net/problem=26
この問題に対する私の解決策は次のとおりです。
answer26 = answer26' 1000
answer26' n = snd $ maximum $ map (\x -> cycleLength x [1]) [2..n - 1]
where
cycleLength n (r:rs)
| i /= Nothing = (1 + fromJust i, n)
| r < n = cycleLength n $ (10*r):r:rs
| otherwise = cycleLength n $ (r `mod` n):r:rs
where i = elemIndex r rs
これは最も効率的なアルゴリズムではないことを認識していますが、単純に O(n^3) (n = 1000) であるため、それほど問題ではありません。しかし、私が懸念しているのは、モナドに関する私の理解から、モナドを使用したものを何らかの意味で「マーク」するという主な特性の 1 つであるということです。関数「fromJust」は、それに直面して直接飛んでいるようです。なぜそれが存在するのですか?また、その存在が正当化されていると仮定すると、上記のコードでの私の使用法は適切ですか?