idris-0.99: test/interfaces002/interfaces002.idr
import Data.Vect
%default total
interface ArrayM where
Array : (n : Nat) -> (a : Type) -> Type
create : (n : Nat) -> a -> Array n a
lkp : (i : Nat) -> (prf : LTE (S i) n) -> Array n a -> a
upd : a -> (i : Nat) -> (prf : LT i n) -> Array n a -> Array n a
using (ArrayM)
sumArrayHelp : Num a => (k : Nat) -> LT k (S n) -> Array n a -> a
sumArrayHelp Z x y = 0
sumArrayHelp (S k) (LTESucc prf) y
= lkp k prf y + sumArrayHelp k (lteSuccRight prf) y
sumArray : Array n Int -> Int
sumArray {n} x = sumArrayHelp n lteRefl x
implementation ArrayM where
Array = Vect
create n x = replicate n x
lkp Z (LTESucc x) (y :: xs) = y
lkp (S k) (LTESucc x) (y :: xs) = lkp k x xs
upd val Z (LTESucc p) (_ :: xs) = val :: xs
upd val (S k) (LTESucc p) (x :: xs) = x :: upd val k p xs
-- using (ArrayM as vectArray)
testSum : Array n Int -> Int
testSum = sumArray
main : IO ()
main = printLn (testSum (upd 11 1 (LTESucc (LTESucc LTEZero)) (create 4 10)))