module test import StdEnv class arith v where lit :: a -> v a | toString a plus :: (v a) (v a) -> v a | + a class rtrn v :: (v a) -> v (TaskValue a) :: Print a = P String unPrint :: (Print a) -> String unPrint (P a) = a :: Eval a = E a unEval :: (Eval a) -> a unEval (E a) = a :: TaskValue a = NoValue | Value a Bool instance arith Print where lit a = P (toString a) plus (P a) (P b) = P (a +++ "+" +++ b) instance arith Eval where lit a = E a plus (E a) (E b) = E (a + b) instance rtrn Print where rtrn (P a) = P ("Task (" +++ a +++ ")") instance rtrn Eval where rtrn (E a) = E (Value a True) class default a :: a instance default Int where default = 42 instance default (TaskValue a) where default = NoValue listItem :: (A.v: a -> v (TaskValue b) | rtrn, arith v) -> (String, b) | +, toString, default b & default a listItem mtask = ( unPrint (mtask default) , default //unEval (mtask default) ) Start :: (String, Int) Start = listItem \i->rtrn (lit i)