作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我完全按照本书(第一个版本)中的示例复制了此示例。
书中给出:
p :: Parser (Char,Char)
p = do x <- item
item
y <- item
return (x,y)
40 | p = do x <- item
| ^^^^^^^^^
:40:9: error:
* Couldn't match type `([(Char, String)], [(Char, String)])'
with `[((Char, Char), String)]'
Expected type: Parser (Char, Char)
Actual type: String -> ([(Char, String)], [(Char, String)])
* In a stmt of a 'do' block: x <- item
In the expression:
do x <- item
item
y <- item
return (x, y)
In an equation for `p':
p = do x <- item
item
y <- item
....
(deferred type error)
最佳答案
你是对的。解析器只是函数的别名,因此它使用(->)的Monad实例。这就是为什么您得到String -> ([(Char, String)], [(Char, String)])
而不是Parser (Char, Char)
或String -> [((Char, Char), String)]
的原因。
我建议您自己创建一个新类型,并实例化Functor,Applicative和Monad以获得预期的结果。
这将完成工作:
newtype Parser a = Parser { parse :: String -> [(a, String)] }
item :: Parser Char
item = Parser $ \case
[] -> []
(c:cs) -> [(c, cs)]
instance Functor Parser where
fmap f p = Parser $ \s ->
concatMap (\(a, s) -> [(f a, s)]) $ parse p s
instance Applicative Parser where
pure a = Parser $ \s -> [(a, s)]
pf <*> pa = Parser $ \s ->
concatMap
(\(f, s') -> fmap (\(a, s'') -> (f a, s'')) (parse pa s'))
(parse pf s)
instance Monad Parser where
return a = Parser $ \s -> [(a, s)]
pa >>= f = Parser $ \s ->
concatMap (\(a, s') -> parse (f a) s') (parse pa s)
p :: Parser (Char,Char)
p = do x <- item
item
y <- item
return (x,y)
关于haskell - Haskell : Graham Hutton Book-(old-Yellow), Parsing (Ch-8),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49207052/
Hutton's Razor 是一种带有常量和加法的简单表达式语言: data HR = Const Int | HR :+: HR eval :: HR -> Int eval (C
我完全按照本书(第一个版本)中的示例复制了此示例。 书中给出: p :: Parser (Char,Char) p = do x ([(Char, String)], [(Char, String
我的问题是关于 Graham Hutton 的书 Programming in Haskell 1st Ed . 在第 8.4 节中创建了一个解析器,我假设任何回答的人都有这本书或者可以在上面的链接中
我是一名优秀的程序员,十分优秀!