2011-03-06 2 views
0
flattern :: [(Char, Int)] -> String 
flattern [] = "" 
flattern ((w,l):xs) = show l ++ w : flattern xs 

이 반대 기능은 무엇입니까? 이것을 해결할 수있는 방법이 있습니까?이 함수의 역함은 무엇입니까?

+1

하스켈을 알지 못한다면, 역함수에 대한 역함수가 있다고 생각하지 않습니다. –

+1

왜이 태그에는 "work"가 붙어 있습니까? 이 어설프고 끔찍한 제목의 질문에 어떤 업무용 응용 프로그램이있을 수 있습니까? –

답변

2

그것은 반전이 아니다 :

  1. 은 (임의의 문자열이 숫자로 시작되지 않음)이 기능을 재현 할 수없는 문자열이 있습니다.

  2. 부분적으로 반전되지 않습니다. 여러 개의 입력에 해당하는 문자열도 있습니다. 또는 [('1',111)]으로 "1111"을 생성 할 수 있습니다.

이 기능을 반전하는 기능으로 사용 하시겠습니까? flattern ((w,l):xs) = replicate l w ++ flattern xs과 같은 것이 아닌가요?

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)]으로 구문 분석됩니다.

관련 문제