这个函数的反转是什么?

时间:2011-03-06 20:00:01

标签: haskell

flattern :: [(Char, Int)] -> String
flattern [] = ""
flattern ((w,l):xs) = show l ++ w : flattern xs

这是什么反函数?有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:2)

这不可逆转:

  1. 此函数无法复制字符串(任何不以数字开头的字符串)。

  2. 它甚至不是部分可逆的。还有一些字符串对应多个输入:"1111"可以由[('1',1),('1',1)][('1',111)]生成。

  3. 你确定这是要反转的功能,而不是flattern ((w,l):xs) = replicate l w ++ flattern xs吗?

答案 1 :(得分:0)

如果你真的想要,你可以解析函数的输出来尝试重建参数必须是什么。

import Text.ParserCombinators.Parsec

unflat1 :: Parser (Char, Int)
unflat1 = do
           c <- anyChar
           n <- many1 digit
           return (c, read n) 

readExpr :: String -> Either String [(Char, Int)]
readExpr input = case parse (many unflat1) "unflat" input of
    Left err -> Left ("No match: " ++ show err)
    Right val -> Right val

只要flattern没有数字作为第一个输入,这种分类就可以工作。 flattern [('a',1), ('2',3)]之类的内容将被解析为[(a, 123)]