0

我正在尝试为诸如xA(即单个字母)6570(即整数正数)之类的字符串编写解析器。这是我写的代码。

import Text.Parsec

data Expression = String String | Number Int

value = letter <|> many1 digit

但是我收到以下错误。

Couldn't match type ‘[Char]’ with ‘Char’
  • 如何Char -> String在解析器内部进行转换?
  • 类型注释应该用于value 什么?
4

1 回答 1

1

letter只解析一个字母并返回一个Char. 你想解析 a String,即[Char](它是同一件事),所以我猜你想解析many letter

但是,如果您只想将单个字母解析为 a String,则可以利用Parsec _ _具有Functor实例的事实来映射其结果并将其打包到列表中:

value :: Parsec s u String 
value = fmap (:[]) letter <|> many1 digit

编辑后我猜你想解析Expression你提供给我们的,所以你需要一些更花哨的 fmapping 来将结果包装在适当的构造函数中:

value :: Parsec s u Expression 
value = fmap (String . (:[])) letter
    <|> fmap (Number . read) (many1 digit)
于 2020-12-23T11:59:24.837 回答