我一直在环顾四周,无法找到这方面的例子,我的所有语法摔跤技巧都让我失望。有谁能告诉我如何编译?我,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).
基本上我正在尝试写这个haskell(也可能很糟糕,但超出了这一点):
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
答案 0 :(得分:6)
主要问题是在if
中,您只能使用 guards 作为测试。防护是非常有限的,除其他外,不允许调用一般的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 if
和about guards。