将字符串转换为元组,Haskell中的特殊格式

时间:2014-04-05 19:55:08

标签: string haskell tuples

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

输入字符串示例

"2s"

"13f"

"1b"

所需输出元组的示例(Int,Char)

(2, 's')

(13, 'f')

(1, 'b')

任何指针都会非常感激。感谢。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

这是一种方法:

import Data.Maybe (listToMaybe)

parseTuple :: String -> Maybe (Int, Char)
parseTuple s = do
  (int, (char:_)) <- listToMaybe $ reads s

  return (int, char)

这使用Maybe Monad来表示可能的解析失败。请注意,如果(char:_)模式无法匹配(即,如果只有一个数字后面没有字符),则会将其转换为Nothing结果(这是由{{1}符号在Haskell中有效。如果模式匹配失败,它会调用do的{​​{1}}函数。对于fail,我们有Monad)。如果Maybe a无法在输入开头读取fail _ = Nothing,则该函数的计算结果为Nothing。如果发生这种情况,reads会提供Int,然后由reads转为[]