在Haskell中创建一个for循环

时间:2017-03-09 23:37:40

标签: loops haskell

我正在学习函数式编程Haskell。

我要求我需要从命令行读取整数值和最大值,我需要确定整数值是否在[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,如果是(1 / x 2 / x .... y / x),它会打印成功或失败。

我认为循环为:

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

  repeatNTimes (n-1) 

然而,这将从n迭代到0,我想从1迭代到20。

如何在Haskell中执行此操作以便检查我的奇数值?

1 个答案:

答案 0 :(得分: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