我用 sum 数据类型创建了一个非常有用的 Free Monad。这抽象了对持久数据存储的访问:
data DataStoreF next =
Create Asset ( String -> next)
| Read String ( Asset -> next)
| Update Asset ( Bool -> next)
| UpdateAll [Asset] ( Bool -> next)
| Delete Asset ( Bool -> next)
| [...] -- etc. etc.
| Error String
type DataStore = Free DataStoreF
我想创建DataStore
一个实例,MonadError
错误消息处理为(Free (Error str))
:
instance MonadError String DataStore where
throwError str = errorDS str
catchError (Free (ErrorDS str)) f = f str
catchError x _ = x
但是我遇到了重叠实例错误。
DataStore
制作单子和实例的正确方法是MonadError
什么?