packages feed

morte-1.5.0: test/src/example5.mt

-- all.mt

-- let data Bool = True | False
--
--     data List a = Cons a (List a) | Nil
--
-- in  let (&&) :: Bool -> Bool -> Bool
--         (&&) b1 b2 = if b1 then b2 else False
--
--         bools :: List Bool
--         bools = Cons True (Cons True (Cons True Nil))
--
--     in  foldr bools (&&) True

(   \(Bool : *)
->  \(True  : Bool)
->  \(False : Bool)
->  \(if : Bool -> forall (r : *) -> r -> r -> r)
->  \(List : * -> *)
->  \(Cons : forall (a : *) -> a -> List a -> List a)
->  \(Nil  : forall (a : *)                -> List a)
->  \(  foldr
    :   forall (a : *) -> List a -> forall (r : *) -> (a -> r -> r) -> r -> r
    )
->  (   \((&&) : Bool -> Bool -> Bool)
    ->  \(bools : List Bool)
    ->  foldr Bool bools Bool (&&) True
    )

    -- (&&)
    (\(x : Bool) -> \(y : Bool) -> if x Bool y False)

    -- bools
    (Cons Bool True (Cons Bool True (Cons Bool True (Nil Bool))))
)

-- Bool
(forall (r : *) -> r -> r -> r)

-- True
(\(r : *) -> \(x : r) -> \(_ : r) -> x)

-- False
(\(r : *) -> \(_ : r) -> \(x : r) -> x)

-- if
(\(b : forall (r : *) -> r -> r -> r) -> b)

-- List
(   \(a : *)
->  forall (list : *)
->  (a -> list -> list)  -- Cons
->  list                 -- Nil
->  list
)

-- Cons
(   \(a : *)
->  \(va  : a)
->  \(vas : forall (list : *) -> (a -> list -> list) -> list -> list)
->  \(list : *)
->  \(Cons : a -> list -> list)
->  \(Nil  : list)
->  Cons va (vas list Cons Nil)
)

-- Nil
(   \(a : *)
->  \(list : *)
->  \(Cons : a -> list -> list)
->  \(Nil  : list)
->  Nil
)

-- foldr
(   \(a : *)
->  \(vas : forall (list : *) -> (a -> list -> list) -> list -> list)
->  vas
)