- 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/
Closed. This question needs to be more focused。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅关注editing this post的一个问题。
根据 Cormen 的“算法导论”中对格雷厄姆扫描算法的描述,我发现了以下注释: By checking for a nonleft turn, rather than just a right tu
我的格雷厄姆扫描代码不工作,它应该得到凸面外壳的周长。它得到n个点的输入,这些点可以有小数算法返回的值高于实际周长。 我使用的是我从中了解到的: http://en.wikipedia.org/wik
我的目标是在给定多边形的无序顶点以及平面方程的情况下,找到具有 n 个顶点的 3d 平面多边形的无符号区域。一旦点按顺时针或逆时针顺序排序,我已经有一个有效的算法来计算面积(来自本网站:http://
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 3个月前关闭。 Improve this quest
按照 Paul Graham 的 Bel 规范 ( bel reference )他这样定义“mac”宏: (mac mac (n . rest) `(set ,n (macro ,@rest)))
Jarvis:对于n个输入点和h个极值点,该算法在最坏情况下需要O(nh)时间。 Graham:最坏情况下的 O(nlogn)。 Source CGAL 的引用,我在其中使用了这两种算法。 这意味着当
(defmacro random-choice (&rest exprs) `(case (random ,(length exprs)) ,@(let ((key -1))
我完全按照本书(第一个版本)中的示例复制了此示例。 书中给出: p :: Parser (Char,Char) p = do x ([(Char, String)], [(Char, String
这里是 Lisp 新手。 我正在阅读 Paul Graham 的书 ANSI Common Lisp。 第 38 页是一个uncompress 函数。它需要一个成对列表,其中成对中的第一项是一个数字,
谁能解释 Paul Graham 的 ANSI Common Lisp 第 110 页中的示例? 该示例尝试解释使用 &rest 和 lambda 来创建函数式编程工具。其中之一是组合函数参数的函数。
我正在阅读 Graham 的“On Lisp”一书,但无法理解第 37 页的以下示例: If we define exclaim so that its return valueincorporates
我的问题是关于 Graham Hutton 的书 Programming in Haskell 1st Ed . 在第 8.4 节中创建了一个解析器,我假设任何回答的人都有这本书或者可以在上面的链接中
谷歌的Golang解决 Paul 的 Graham 的帖子“Why Arc isn't Especially Object Oriented”中提到的语言问题'? 最佳答案 我对此的初步感觉是“现在下
我是一名优秀的程序员,十分优秀!