首先,只是一些快速的上下文。我正在阅读Haskell Programming From First Principles这本书,并遇到了以下练习。
尝试编写一个解析器,它可以做什么
string
,但使用char
.
我想不通,所以我检查了实现的源代码。我目前正试图绕过它。这里是:
class Parsing m => CharParsing m where
-- etc.
string :: CharParsing m => String -> m String
string s = s <$ try (traverse_ char s) <?> show s
我的问题如下,从最具体到最不具体。
为什么是
show
必要的?为什么是
s <$
必要的?工作不traverse char s <?> s
一样吗?换句话说,为什么我们要把遍历的结果扔掉呢?遍历发生了什么?我得到了列表遍历的作用,所以我想我对 Parser 的 Applicative/Monad 实例感到困惑。在高层次上,我知道遍历 apply
char
具有 typeCharParsing m => Char -> m Char
,适用于 string 中的每个字符s
,然后将所有结果收集到 typeParser [Char]
中。所以类型是有道理的,但我不知道后台发生了什么。
提前致谢!