【发布时间】:2019-01-13 00:57:33
【问题描述】:
我正在尝试在 case 子句中执行模式匹配:
-- different types of Parsers:
-- type Parser = String -> Maybe (String, String)
-- type Parser = String -> Maybe (Tree, String)
-- type Parser = String -> Maybe (Int, String)
-- can be generalized as:
data Parser a = Parser (String -> Maybe (a, String))
class Monad' m where
result :: a -> m a
bind :: m a -> (a -> m b) -> m b
instance Monad' Parser where
result v = Parser (\input -> Just (v, input))
bind (Parser fa) fb = Parser (\input ->
case (fa input) of
Nothing -> Nothing
Just(v, input') -> pb input' where pb in fb v = (Parser pb)
)
问题在于where pb in fb v = (Parser pb)。如何声明 pb,然后通过调用 (fb input') 进行模式匹配。
还需要在声明中包含构造函数Parser:data Parser a = Parser (String -> Maybe (a, String)) 似乎使事情复杂化了很多。写起来会简单得多:
data Parser a = String -> Maybe (a, String),但这是不可能的,还有其他方法可以实现吗?
【问题讨论】:
-
一般版本是
StateT -
@xgrommx 试图自己做以了解 monad