2012-11-13 66 views
1

我一直在四處尋找,也找不到這和我所有的語法的摔跤技術是失敗的例子我嵌套函數。有人可以告訴我如何使這個編譯?我,S,S或.S只是錯了,我想定義一個嵌套函數...二郎語法與如果

我知道有做字符串函數替換已經所以我並不需要實現這一點,但我「M使用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中,您只能使用衛兵作爲測試。警衛隊非常受限制,除其他事項外,不允許打電話給一般的Erlang功能。無論它們是否爲OTP發行版的一部分或由您撰寫。您的功能的最佳解決方案是使用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). 

因爲這個if並不經常在Erlang中使用。請參閱Erlang文檔中的about ifabout guards

+0

好吧,'有趣'的結局也缺失了。其實,替代功能應該是做什麼的? – user425720

+0

我剛開始做一個案例,但它遇到了與案例相同的語法錯誤。這給出了相同的語法錯誤。 –

+0

@ user425720替換函數的工作方式如下:replace(「Hello Donut!」,「Donut」,「World」) - >「Hello World!」使用以這種方式工作的foldr的技術起作用,這只是一個讓嵌套函數以某種方式在語法上正確結束的問題。 –