For in Idris

Idris provides several ways to create loops and iterate over collections. Here are some basic types of loops in Idris.

import Data.String

main : IO ()
main = do
    -- The most basic type, with a single condition.
    let i = 1
    loop1 i
    where
        loop1 : Int -> IO ()
        loop1 i = 
            if i <= 3
            then do
                putStrLn $ show i
                loop1 (i + 1)
            else pure ()

    -- A classic initial/condition/after loop using recursion.
    loop2 0
    where
        loop2 : Int -> IO ()
        loop2 j = 
            if j < 3
            then do
                putStrLn $ show j
                loop2 (j + 1)
            else pure ()

    -- Another way of accomplishing the basic "do this N times" iteration
    -- is using `replicateM_`.
    replicateM_ 3 $ \i -> 
        putStrLn $ "range " ++ show i

    -- Idris doesn't have a direct equivalent to Go's infinite loop,
    -- but we can create one using recursion.
    let infiniteLoop = do
        putStrLn "loop"
        pure ()  -- In this case, we're just exiting after one iteration

    infiniteLoop

    -- You can also use list comprehension for iteration with filtering.
    let oddNumbers = [n | n <- [0..5], n `mod` 2 /= 0]
    traverse_ (\n -> putStrLn $ show n) oddNumbers

To run the program, save it as for.idr and use the Idris interpreter:

$ idris for.idr -o for
$ ./for
1
2
3
0
1
2
range 0
range 1
range 2
loop
1
3
5

In Idris, we use recursion and higher-order functions like replicateM_ to achieve looping behavior. The traverse_ function is used to iterate over a list and perform an action for each element. List comprehensions provide a concise way to generate lists with conditions.

We’ll see some other forms of iteration later when we look at list processing, IO operations, and other data structures.

查看推荐产品

Comments powered by Disqus