0

我正在尝试创建一个非常简单的递归函数来删除具有用户从列表中决定的特定值的所有元素。

在 haskell 中,我会使用警卫并执行以下操作:

deleteAll_rec _ [] = []
deleteAll_rec del (x:xs) | del==x = deleteAll_rec del xs
                         | otherwise = x:deleteAll_rec del xs

我正在尝试编写一个等效的 Erlang,但是,我不确定如何处理这种otherwise情况:

deleteAll_rec(_, []) -> [];
deleteAll_rec(DEL, [X|XS]) when DEL =:= X -> deleteAll_rec(DEL, XS).

我想知道是否有人可以证明如何做到这一点?

提前谢谢了!

4

1 回答 1

5

else成为 Erlang 中的一个单独的子句:

delete_all_rec(_, []) -> [];
delete_all_rec(Del, [Del|Xs]) ->
    delete_all_rec(Del, Xs);
delete_all_rec(Del, [X|Xs]) ->
    [X|delete_all_rec(Del, Xs)].

另一种方法是使用iflike:

delete_all_rec(_, []) -> [];
delete_all_rec(Del, [X|Xs]) ->
    if Del =:= X ->
            delete_all_rec(Del, Xs);
        true ->
            [X|delete_all_rec(Del, Xs)]
    end.

结果代码是相同的,但我认为第一个版本看起来更好。在此示例中,无论您将终止案例放在首位还是放在最后都无关紧要,我更喜欢将其放在最后。

于 2013-04-16T20:57:46.767 回答