2012-02-10 32 views
1

在試圖增加我的Haskell知識,我想我會嘗試並得到解決使用狀態Monad的第12個項目歐拉問題。對於我來說,在整個三角形編號創建時加入狀態似乎是有道理的。項目歐拉12與哈斯克爾國家Monad

這裏是我的代碼:

module Main where 

import Control.Monad 
import Control.Monad.State 

type MyState = (Integer, Integer) 
s0 = (7, 28) 

tick :: State MyState Int 
tick = do 
    (n,o) <- get 
    let divs = getDivLen (n,o) 
    if divs >= 500 
     then do 
      let n' = n + 1 
      let o' = o + n' 
      put (n', o') 
      tick 
     else 
      return divs 

getDivLen :: MyState -> Int 
getDivLen (n,o) = foldl1 (+) [2 | x <- [1..x], o `mod` x == 0] 
    where x = round . sqrt $ fromIntegral o 

main :: IO() 
main = print $ evalState tick s0 

代碼編譯,我得到的結果6到控制檯。我只是不確定我做錯了沒有發生遞歸。

在此先感謝。

回答

1

看起來像你有你的循環條件倒退。如果你找到了一個至少有500個除數的三角形數字,那麼你只會遞歸,所以它會立即停止,因爲第一個數字少於這個數字。

要解決此問題,請將行if divs >= 500更改爲if divs < 500

一旦你做完了,你應該返回數字本身,而不是除數,所以你必須修復return divs以及。我會留下修復那部分給你。

+0

哇,我很沮喪,爲什麼事情不起作用,我完全錯過了簡單的東西。感謝您指出了這一點。我現在正在工作。 – Bryce 2012-02-10 17:35:46