![](/img/trans.png)
[英]Are Maybe String and Maybe Int both Monoids in Haskell?
[英]How to delete “Just” in Maybe String or Maybe Int in Haskell
我是Haskell的新手,并且需要一些帮助。 我有一个XML文件,我想解析其中的两件事。 一个是一对数字,第二个只是一个字母。 我使用两个函数来解析每个元素,并且该函数的结果必须为“也许是字符串”,否则它将不起作用。
问题是,当我显示结果时,它始终附加一个“ 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
为什么会这样呢? 读取功能有问题吗?
Char
的read
解析器希望将字符括在单引号中,即,您需要类似"'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或模式匹配失败时才有效。
将字母的定义更改为:
letter :: [Maybe String] -> [Char]
letter [] = []
letter (Just x : ls) = (head x) : letter ls
说明: read
将尝试以Haskell Char文字形式读取字符串的内容。 由于Haskell中的Char文字以引号结尾,因此您的字符串需要包含它们(即: read "'B'" :: Char
起作用, read "B" :: Char
不起作用)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.