1

我一直在环顾四周,找不到这样的例子,我所有的语法摔跤技巧都让我失望了。有人可以告诉我如何编译吗?我的 ,s ;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
4

1 回答 1

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 文档中的aboutifabout 守卫

于 2012-11-13T21:09:51.990 回答