0

我是haskell的新手,需要一点帮助来解决问题。我有一个 XML 文件,我想解析其中的两件事。一个是一对数字,第二个只是一个字母。我使用两个函数来解析每个元素,并且这些函数的结果必须是“Maybe String”,否则它将不起作用。

问题是,当我显示结果时,它总是附有一个“Just”。所以如果我想显示类似(1,2)B

我将拥有(仅“1”,仅“2”)仅“B”

对于数字,我得到了解决方案。我已经使这个函数与我从对的解析中获得的列表一起工作:

pair:: [(Maybe String, Maybe String)] -> [(Int, Int)]
pair [] = []
pair ((Just x, Just y) : ls) = (read x, read y) : pair ls

它工作正常。但是我尝试对带有字母的列表做同样的事情,但它不起作用。

这是我的代码:

letter :: [Maybe String] -> [Char]
letter [] = []
letter (Just x : ls) = read x : letter ls

当我运行它时,我得到了正确的配对列表和这个错误

myfile.hs: Prelude.read: no parse

为什么会这样?读取功能有问题吗?

4

2 回答 2

3

read解析器Char期望字符用单引号括起来,即你需要一个像"'M'".

Prelude> read "M" :: Char
*** Exception: Prelude.read: no parse
Prelude> read "'M'" :: Char
'M'

你可能想做类似的事情

letter :: [Maybe String] -> [Char]
letter [] = []
letter (Just [x] : ls) = x : letter ls

但是,这当然只有在您总是只得到Just值而没有Nothing值并且所有字符串的长度必须为 1 否则模式匹配将失败的情况下才有效。

于 2013-11-13T17:33:20.117 回答
0

将您对字母的定义更改为:

letter :: [Maybe String] -> [Char]
letter [] = []
letter (Just x : ls) = (head x) : letter ls

解释:read将尝试将字符串的内容读取为 Haskell Char 文字。由于 Haskell 中的 Char 文字以引号结尾,因此您的字符串需要包含它们(即:read "'B'" :: Char有效,read "B" :: Char无效)。

于 2013-11-13T17:34:40.570 回答