2014-12-02 2 views
0

다른 문자열 (w2)이있는 문장에서 문자열 (w1)을 바꿔주는 함수를 만들려고합니다. 내가 '정의되지 않은 변수를 "주"'오류가 발생하고, '경고 : 사용 정의가 아니라`W1'하고있어,Haskell - 함수에서 단어 바꾸기

swapwords :: String -> String -> String -> String 
swapwords w1 w2 [] = [] 
swapwords w1 w2 (x:xs) 
    | length (x:xs) < n = (x:xs) 
    | otherwise = do 
if w1 == take n (x:xs) then w2 ++ swapwords w1 w2 (drop n (x:xs)) 
else x:swapwords w1 w2 xs 
where 
    n = length w1 

을하지만 '와'W2 '여기에 지금까지 가지고있는 것입니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+2

Text.Data.Text는 들여 쓰기 문제 같은데 지원하지 않습니다, 지금에 의해 이에 대한 아마 더 나은; 하스켈은 공백에 민감하다는 것을 기억하십시오. –

+1

또한이 컨텍스트에서 do를 사용하지 않아야합니다. 이것은 모나드로 작업하고 싶을 때 (그리고 목록이 모나드를 구성하는 동안 여기에서 모나드를 사용하지 않을 때) 예약되어 있습니다. – bheklilr

답변

0

이 오류는 함수 main을 정의하지 않은 모듈에서 실행 파일을 작성하려고하기 때문에 발생합니다. 경고는 코드가 약간 어색하게 들여서 발생합니다. (Haskell 2010 컴파일러를 사용하고 있다고 가정합니다 .Haskell 2010 모드로 컴파일하면 GHC 7.8.3이 코드를 승인합니다.)

do -notation은 String (문자열은 목록이고 목록의 형식 생성자는 모나드입니다.) 형식의 표현식을 작성하는 데는이 컨텍스트에서 수행하는 것이 약간 이상합니다 (구성중인 문자열에 모나드를 실제로 수행하지는 않습니다. 너 아니니?).

이 약간 코드를 포맷하고 (또한 하스켈 98) 실행에 코드를 컴파일을하는 함수 main를 추가 :

$ ghc --version 
The Glorious Glasgow Haskell Compilation System, version 7.8.3 

$ ghc -XHaskell98 Test.hs -o test.exe 
[1 of 1] Compiling Main    (Test.hs, Test.o) 
Linking test.exe ... 

$ ./test.exe 
foo qux baz 
:

swapwords :: String -> String -> String -> String 
swapwords w1  w2  []  = [] 
swapwords w1  w2  (x : xs) 
    | length (x:xs) < n      = x : xs 
    | otherwise        = 
     if w1 == take n (x:xs) 
     then w2 ++ swapwords w1 w2 (drop n (x:xs)) 
     else x : swapwords w1 w2 xs 
    where 
    n = length w1 

main :: IO() 
main = putStrLn (swapwords "bar" "qux" "foo bar baz") 

다음이 실행 파일을 실행하면 코드를 테스트 할 수 있습니다

0

컴파일 문제와 관련이 없지만 Text.Regex.PCRE을 사용하여 함수를 구현할 수있는 또 다른 방법은 다음과 같습니다.

this text-icu library 비록210
module Swap where 

import Text.Regex.PCRE ((=~)) 

swap :: String -> String -> String -> String 
swap orig toSwap ws = 
    case ws =~ orig :: (String,String,String) of 
    (_,"","") -> ws 
    (b,_,a) -> b ++ toSwap ++ a 

Text.Regex