2011-10-22 2 views
1

그래서 튜플의 다음 목록 및 문자열을나는 문자열 하스켈에서 대체 어떻게해야합니까

 

type M a = [(String, String)] 
m = [ 
    ("x", "a car"), 
    ("y", "a animal") 
] 
s = "this is x and y" 
 

내가

strRep m s에 노력하고 =>

"이 차와 동물이다"

그래서 이것은 위의 코드는 문자열 목록을 반환 지금까지

 

import Data.List.Utils 

strRep :: (Show a) => M -> String -> String 
strRep [] s = s 
strRep (m:ms) s = replace (fst m) (snd m) s : strRep ms s 
 

내 시도이다. 나는 여기서 루프를 수행하는 올바른 방법을 이해할 수 없다.

+1

당신의 수입을 보여 ou는 수 있습니까? 어디에서'대체 '할거야? –

답변

3

위의 예에서 replace이 어디에서 오는지 확실하지 않습니다. 하지만 ...이 존재 가정, 당신이 기대하는 것을, 당신은 당신의 strRep 기능에서 단점 (:)를 제거하고 대신과 같이, strRep의 다음 실행에 교체의 결과 통과 할 수있을 것입니다 않습니다

strRep :: (Show a) => M -> String -> String 
strRep [] s = s 
strRep (m:ms) s = strRep ms (replace (fst m) (snd m) s) 

이제 문자열 목록을 반환하는 대신 하나의 항목이 대체 된 버전을 각각 반환합니다. 각 문자열을 반복적으로 교체하고 다음 문자열을 새 문자열로 전달합니다.

+1

죄송합니다. 대체는 Data.List.Utils입니다. – nobody

0
replace m w = case (lookup w m) of 
          Just w' -> w' 
          otherwise -> w 

strRep :: [(String, String)] -> String -> String 
strRep m s = unwords $ map (replace m) $ words s 
0

또 다른 방법은 문제 하스켈 반복

type M = [(String , String)] 

m = [("x", "a car"), 
    ("y", "a animal")] 

lookUp :: String->M ->String 
lookUp a lst = head ([ value| (key ,value) <- lst , key == a]) 


strRep :: String ->M->String 
strRep input replacements = unwords (map repAux (words input)) 
    where 
    poss = map fst replacements 
    repAux :: String -> String 
    repAux x 
     | elem x poss = lookUp x replacements 
     | otherwise = x 
2

해결하기 위해 거의 항상 배를 이용하여 실현 될 수있다.
예제에서 매핑에서 가져온 문자열을 연속적으로 대체하여 결과를 만들어야합니다.

import Data.List(foldl') 

이 그런 다음 strRep의 모습 :

의 엄격한 배를 사용하자

strRep :: M -> String -> String 
strRep m input = foldl' replace input m 

또는 약간 짧은 :

String의 오히려 수행 다루기
strRep = flip $ foldl' replace 

신통치 않게. 더 나은 대안은 TextData.Text에서 처리하는 것입니다.
그런 다음 replace 오히려 정직 :

import qualified Data.Text as T 

replace :: String -> (String,String) -> String 
replace s (a,b) = let [ss,aa,bb] = [T.pack x | x <- [s,a,b]] in 
    T.unpack $ T.replace aa bb ss