繁体   English   中英

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

[英]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

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

Charread解析器希望将字符括在单引号中,即,您需要类似"'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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM