Recursion in Idris

Our example demonstrates recursive functions in Idris. Here’s a classic example of factorial calculation using recursion.

module Main

import System.IO

-- This `fact` function calls itself until it reaches the
-- base case of `fact 0`.
fact : Int -> Int
fact n = 
    if n == 0 
        then 1
        else n * fact (n - 1)

main : IO ()
main = do
    putStrLn $ show $ fact 7

    -- Idris doesn't have closures in the same way as some other languages,
    -- but we can define local functions that capture variables from their
    -- surrounding scope. Here's a fibonacci function defined locally:
    let fib : Int -> Int
        fib n = 
            if n < 2 
                then n
                else fib (n - 1) + fib (n - 2)
    
    putStrLn $ show $ fib 7

In this example, we define a recursive fact function to calculate factorials. The function calls itself with n - 1 until it reaches the base case of n == 0.

We then define a local function fib inside the main function to calculate Fibonacci numbers. This demonstrates how Idris allows local function definitions that can be recursive.

To run this program, save it in a file with a .idr extension (e.g., recursion.idr), then use the Idris compiler to compile and run it:

$ idris recursion.idr -o recursion
$ ./recursion
5040
13

The output shows the factorial of 7 (5040) and the 7th Fibonacci number (13).

Idris’s strong type system and support for dependent types make it particularly well-suited for writing provably correct recursive functions. While this example doesn’t showcase these advanced features, they’re available when you need them for more complex recursive algorithms.

查看推荐产品

Comments powered by Disqus