如何在Haskell中的Maybe String或Maybe Int中删除“Just”

时间:2013-11-13 17:28:23

标签: haskell

我是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

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

2 个答案:

答案 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没有。)