Methods in Idris
module Main
import System.IO
-- Idris supports records, which are similar to structs
record Rect : Type where
constructor MkRect
width : Int
height : Int
-- This 'area' function takes a Rect as an argument
area : Rect -> Int
area r = r.width * r.height
-- Here's another function that takes a Rect
perim : Rect -> Int
perim r = 2 * r.width + 2 * r.height
main : IO ()
main = do
-- Create a Rect instance
let r = MkRect 10 5
-- Call the functions we defined
putStrLn $ "area: " ++ show (area r)
putStrLn $ "perim: " ++ show (perim r)
-- In Idris, we don't need to worry about pointer vs value semantics
-- as it's a purely functional language
putStrLn $ "area: " ++ show (area r)
putStrLn $ "perim: " ++ show (perim r)
In Idris, we define a Rect
record which is similar to a struct. Instead of methods, we define functions that take a Rect
as an argument.
The area
function calculates the area of a rectangle:
area : Rect -> Int
area r = r.width * r.height
And the perim
function calculates its perimeter:
perim : Rect -> Int
perim r = 2 * r.width + 2 * r.height
In the main
function, we create a Rect
instance and call our functions:
main : IO ()
main = do
let r = MkRect 10 5
putStrLn $ "area: " ++ show (area r)
putStrLn $ "perim: " ++ show (perim r)
Idris is a purely functional language, so we don’t need to worry about pointer vs value semantics. There’s no distinction between calling methods on a value or a pointer.
To run this program, you would save it as a .idr
file and use the Idris compiler:
$ idris -o rect rect.idr
$ ./rect
area: 50
perim: 30
area: 50
perim: 30
In Idris, we use records and functions instead of structs and methods, but the core concept of bundling data with operations on that data remains the same.