adamc@841: datatype t = datatype Basis.option adamc@841: adam@1544: val monad = mkMonad {Return = @@Some, adam@1544: Bind = fn [a] [b] (m1 : t a) (m2 : a -> t b) => adam@1544: case m1 of adam@1544: None => None adam@1544: | Some v => m2 v} adam@1544: adamc@846: fun eq [a] (_ : eq a) = adamc@846: mkEq (fn x y => adamc@846: case (x, y) of adamc@846: (None, None) => True adamc@846: | (Some x, Some y) => x = y adamc@846: | _ => False) adamc@846: adamc@961: fun ord [a] (_ : ord a) = adamc@961: mkOrd {Lt = fn x y => adamc@961: case (x, y) of adamc@961: (None, Some _) => True adamc@961: | (Some x, Some y) => x < y adamc@961: | _ => False, adamc@961: Le = fn x y => adamc@961: case (x, y) of adamc@961: (None, _) => True adamc@961: | (Some x, Some y) => x <= y adamc@961: | _ => False} adamc@961: adamc@944: fun isNone [a] x = adamc@944: case x of adamc@944: None => True adamc@944: | Some _ => False adamc@944: adamc@841: fun isSome [a] x = adamc@841: case x of adamc@841: None => False adamc@841: | Some _ => True adamc@844: adamc@844: fun mp [a] [b] f x = adamc@844: case x of adamc@844: None => None adamc@844: | Some y => Some (f y) adamc@846: adamc@846: fun bind [a] [b] f x = adamc@846: case x of adamc@846: None => None adamc@846: | Some y => f y adamc@1068: adamc@1068: fun get [a] (x : a) (o : option a) = adamc@1068: case o of adamc@1068: None => x adamc@1068: | Some v => v mad@1831: mad@1831: fun unsafeGet [a] (o : option a) = mad@1831: case o of mad@1831: None => error Option.unsafeGet: encountered None mad@1831: | Some v => v