我是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
为什么会这样?读取功能是问题吗?
答案 0 :(得分:3)
read
的{{1}}解析器希望字符用单引号括起来,即你需要一个像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
值并且所有字符串的长度必须为1或模式匹配失败时才有效。
答案 1 :(得分: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
没有。)