【发布时间】:2020-02-19 15:19:46
【问题描述】:
我知道可以像这样对(命名的)构造函数进行模式匹配:
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
如何为一般Alternatives写这样的函数类似于
f :: (Alternative m) => m a -> Bool
f empty = False
f x = True
如果我尝试这个,我会收到错误 Parse error in pattern: empty。我想这是有道理的,因为empty 在这里是一个函数而不是构造函数。但是对于一般的Alternatives,我怎样才能做到这一点呢?
编辑 1:
我的实际目标是为自定义结果类型定义一个Monad 实例(也可能还有一个MonadPlus 实例)。代替基本的Either Error Result 类型,它应该支持Maybe Error(如果可能还支持其他Alternatives,如[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)
【问题讨论】:
-
empty不是函数;这是一个价值。但它是一个值的name,而不是创建该值的构造函数。 -
@chepner 出于好奇,值和函数之间有什么区别吗? Haskell 的类型系统似乎没有任何作用。至少这是我的新手对它的看法。
-
嗯,所有函数都是值,但并非所有值都是函数。函数具有由
(->)运算符创建的类型,而f a不一定是这样的类型。
标签: haskell typeclass alternative-functor