我正在尝试学习 Haskell,所以我在 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)不是这样的问题。不过,我担心的是,根据我对 monad 的理解,它们的主要属性之一是它们在某种意义上“标记”了任何使用过 monad 的东西。函数“fromJust”似乎直接与它背道而驰。它为什么存在?另外,假设它的存在是合理的,我在上面的代码中使用它是好的做法吗?