2014-04-05 37 views
0

对于测试应用程序,我试图将特殊类型的字符串转换为元组。该字符串始终采用以下格式,其中int(n> = 1)后跟一个字符。输入字符串的将字符串转换为元组,特殊格式的Haskell

实例:所需的输出元组(中间体,CHAR)

"2s" 

"13f" 

"1b" 

实例:

(2, 's') 

(13, 'f') 

(1, 'b') 

任何指针将非常理解的。谢谢。

回答

3

您可以使用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) 
0

这里有一个办法做到这一点:

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

相关问题