adamc@841: datatype t = datatype Basis.option adamc@841: 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