我知道有可能对(命名的)构造函数进行模式匹配,如下所示:
f1 :: Maybe a -> Bool
f1 Nothing = False
f1 (Just x) = True -- in reality have something that uses x here
f2 :: [a] -> Int
f2 [] = False
f2 x = True
我怎样才能为 general Alternative
s 编写这样的函数,类似于
f :: (Alternative m) => m a -> Bool
f empty = False
f x = True
如果我尝试这个,我会得到错误Parse error in pattern: empty
。我想这是有道理的,作为empty
这里的函数而不是构造函数。但是,我怎样才能以Alternative
惯用的方式为 general 做到这一点?
编辑 1:
我的实际目标是为自定义结果类型定义一个Monad
实例(也可能是一个MonadPlus
实例)。除了基本Either Error Result
类型,它应该支持 a Maybe Error
(如果可能还有其他Alternative
s like [Error]
)作为错误类型,还应该支持一些Applicative
作为结果类型,以支持惰性求值,例如使用分(Maybe Error, [Tokens])
词器的结果类型。
我想要类似的东西
instance (Alterantive mErr, Applicative mRes) => Monad (mErr e, mRes a) where
return x = (empty, pure x)
(empty, pure x) >>= f = f x
(err, x) >>= f = (err, x)