2012-11-13 3 views
1

나는 이것들을 둘러 보았고 이에 대한 예제를 찾을 수 없으며 모든 구문 레슬링 기술에 실패하고 있습니다. 누군가이 컴파일 방법을 알려주실 수 있습니까 ?? 내, s 또는 .s 중첩 된 함수를 정의하는 것 같아요 ...중첩 된 함수에 대한 Erlang 구문이있는 경우

나는이 구현할 필요가 없으므로 이미 문자열 바꾸기를 수행하는 함수가 있음을 알고 있지만 '

replace(Whole,Old,New) -> 
    OldLen = length(Old), 
    ReplaceInit = fun(Next, NewWhole) -> 
       if 
        lists:prefix(Old, [Next|NewWhole]) -> {_,Rest} = lists:split(OldLen-1, NewWhole), New ++ Rest; 
        true -> [Next|NewWhole] 
       end, 
    lists:foldr(ReplaceInit, [], Whole). 

는 기본적으로 나는 또한 아마 나쁜하지만 포인트 이상이 하스켈 (쓰기 위해 노력하고있어 .. 얼랑 그래서 난 손 내가 사용하는 데 필요한 몇 가지 기본 회전을 해요 그것을 잡으려고 함께 연주 해요) :

repl xs ys zs = 
    foldr replaceInit [] xs 
    where 
    ylen = length ys 
    replaceInit y newxs 
     | take ylen (y:newxs) == ys = zs ++ drop (ylen-1) newxs 
     | otherwise = y:newxs 

답변

6

가장 큰 문제는 if에만 허용됩니다. 경비원을 테스트합니다. 경비원은 매우 제한적이며, 무엇보다도 일반적인 얼랭 기능에 대한 호출은 허용되지 않습니다. 그들이 OTP 릴리스의 일부인지 또는 귀하가 작성한 것인지 여부에 관계없이. 함수의 가장 좋은 해결책은 if 대신 case을 사용하는 것입니다. 예를 들어 :이 때문에 if

replace(Whole,Old,New) -> 
    OldLen = length(Old), 
    ReplaceInit = fun (Next, NewWhole) -> 
         case lists:prefix(Old, [Next|NewWhole]) of 
          true -> 
           {_,Rest} = lists:split(OldLen-1, NewWhole), 
           New ++ Rest; 
          false -> [Next|NewWhole] 
         end 
        end, 
    lists:foldr(ReplaceInit, [], Whole). 

얼랑에서이 자주 사용되지 않습니다. Erlang 문서에서 about ifabout guards을 참조하십시오.

+0

글쎄, '재미'끝도 없습니다. 사실, replace 함수는 무엇을하기로되어 있습니까? – user425720

+0

처음에 사례를 만들었지 만 사례가 실행되고있는 것과 동일한 구문 오류가있었습니다. 동일한 구문 오류가 발생합니다. –

+0

@ user425720 replace 함수는 replace ("Hello Donut!", "Donut", "World") -> "Hello World!"와 같이 작동해야합니다. 이런 식으로 작동하는 foldr를 사용하는 기술이 작동합니다. 어떻게 든 중첩 된 함수를 구문 적으로 올바르게 끝내는 문제입니까? –

관련 문제