【发布时间】:2016-07-25 16:16:55
【问题描述】:
在实现细化类型系统时,我需要进行检查以确保类型格式正确。例如,不应出现Num[100,0] 之类的类型,其中Num[lb,ub] 是大于lb 且小于ub 的数字类型。然后我写道:
-- FORMATION RULES
class RefTy t
where tyOK :: t -> Bool
instance RefTy Ty
where tyOK (NumTy (n1, n2)) = n1 <= n2
tyOK (CatTy cs) = isSet cs
{-
data WellFormed t = Valid t
| Invalid
instance Monad WellFormed
where
(>>=) :: RefTy a => WellFormed a -> (a -> WellFormed b) -> WellFormed b
Valid t >>= f
| tyOK t = f t
| otherwise = Invalid
Invalid >>= _ = Invalid
-}
这让我陷入了“restricted Monad”的已知问题。建议的答案是让Wellformed monad 通用但限制功能。但是,这将回到在任何地方添加格式正确的检查。有没有更好的出行方式?
【问题讨论】:
-
你如何定义
return/pure?
标签: haskell dependent-type refinement-type