对于测试应用程序,我试图将特殊类型的字符串转换为元组。该字符串始终采用以下格式,其中int(n> = 1)后跟一个字符。输入字符串的将字符串转换为元组,特殊格式的Haskell
实例:所需的输出元组(中间体,CHAR)的
"2s"
"13f"
"1b"
实例:
(2, 's')
(13, 'f')
(1, 'b')
任何指针将非常理解的。谢谢。
对于测试应用程序,我试图将特殊类型的字符串转换为元组。该字符串始终采用以下格式,其中int(n> = 1)后跟一个字符。输入字符串的将字符串转换为元组,特殊格式的Haskell
实例:所需的输出元组(中间体,CHAR)的
"2s"
"13f"
"1b"
实例:
(2, 's')
(13, 'f')
(1, 'b')
任何指针将非常理解的。谢谢。
您可以使用readS
解析int和得到字符串的其余部分:
readTup :: String -> (Int, Char)
readTup s = (n, head rest)
where [(n, rest)] = reads s
一个更安全的版本是:
maybeReadTup :: String -> Maybe (Int, Char)
maybeReadTup s = do
[(n, [c])] <- return $ reads s
return (n, c)
这里有一个办法做到这一点:
import Data.Maybe (listToMaybe)
parseTuple :: String -> Maybe (Int, Char)
parseTuple s = do
(int, (char:_)) <- listToMaybe $ reads s
return (int, char)
这使用Monad来表示可能的解析失败。请注意,如果(char:_)
模式不匹配(即,如果只有一个没有任何字符的数字),则会将其转换为Nothing
结果(这归结于do
表示法在Haskell中的工作原理),它调用fail
函数Monad
如果模式匹配失败。在Maybe a
的情况下,我们有fail _ = Nothing
)。如果reads
在输入开始时无法读取Int
,则该函数的计算结果为Nothing
。如果发生这种情况,reads
给出[]
然后通过listToMaybe
变成Nothing
。