2017-03-09 58 views
-2

我在學習函數式編程Haskell。在Haskell中創建for循環

我有我需要從命令行讀取整數值和最大值的要求,我需要確定整數值是否在[1 to max value]的範圍內。我需要確定是否有範圍的值除以整數值。

例如:

program 5 20 

然後我需要檢查是否從[1, 2, ..., 20]任何值整除5按排序順序。

如何編寫這樣的函數?

我已經閱讀了參數作爲

main = do 
    args <- getArgs 
    let first_divisor = args !! 0 
    let upper_bound = args !! 1 

    let x = read first_divisor :: Integer 
    let y = read upper_bound :: Integer 


    --print args 
    --putStrLn first_divisor 
    --putStrLn second_divisor 
    --putStrLn upper_bound 
    isDivisible x y 

我需要編寫此isDivisible函數從1循環至y和如果REM(1/X 2/X .... Y/X),它打印成功或失敗。

我想通了環路:

repeatNTimes 0 = return() 
repeatNTimes n = 
do 
    -- my stuff 

    repeatNTimes (n-1) 

但是,這會從n個迭代0,我想重複1至20

我怎樣才能做到這一點在Haskell使我可以檢查我的奇數值?

+0

是那個單子IO​​你使用你不需要循環?這應該是一個純粹的功能。 – Carcigenicate

+0

@Carcigenicate不,我用havenot monad? monad直接爲我提供循環功能? – user5335302

+3

您正在使用'do'和'return'。 Monad是爲什麼的?你明白Haskell裏有什麼'return'嗎?它與其他語言**非常不同。 'return'是**不用於從函數返回值。 – Carcigenicate

回答

1

當你有一個清單

使用mapmapM

isDivisible :: Int -> Int -> [String] 
isDivisible firstDivisor upperBound = map (isDivided firstDivisor) [1 .. upperBound] 

isDivided :: Int -> Int -> String 
isDivided 0 _ = "Failed" 
isDivided d x = if mod x d == 0 
       then "Success" 
       else "Failed" 

main :: IO() 
main = do 
    input <- getLine 
    let args = words input 
    let first_divisor = args !! 0 
    let upper_bound = args !! 1 

    let x = read first_divisor :: Int 
    let y = read upper_bound :: Int 

    let results = isDivisible x y 

    mapM_ putStrLn results