2017-03-09 57 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