来自Lisp背景,Erlang的case
声明对我来说似乎有点莫名其妙。我正在研究Eratosthenes Sieve问题,试图生成一个数字N的素数因子列表。但是我似乎无法将Lisp中的简单cond
语句迁移到等价物中在Erlang。
到目前为止,我构建了一个if
语句,类似于我将如何处理Lisp中的事情:
prime_factors(N) -> pf_helper(N, [], 2).
pf_helper(M, PL, D) ->
if
prime_p(M) == true -> [ M | PL ];
(prime_p(D) == true) and (M rem D == 0) -> pl_helper(M div D, [ D | PL ], D+1);
(prime_p(D) == true) and (M rem D /= 0) -> pl_helper(M, PL, D+1);
prime_p(D) == false -> pl_helper(M, PL, D+1)
end.
我知道这不会编译,因为我的警卫只能进行BIF
次呼叫。问题是我无法概念化它如何作为case
语句运行,因为case
处理一个参数上的条件表达式。在我代表元组中的三个pf_helper
参数的情况下:
pf_helper(M,PL,D) -> pf_helper({M, PL, D}).
对应于条件表达式
的case语句中的模式是什么 prime_p(M) == true
(prime_p(D) == true) and (M rem D == 0)
(prime_p(D) == true) and (M rem D /= 0)
prime_p(D) == false
答案 0 :(得分:5)
使用一些警卫:
case {prime_p(M), prime_p(D)} of
{true, _} -> [M|PL];
{false, true} when (M rem D == 0) -> ...;
{false, true} when (M rem D /= 0) -> ...;
{false, false} -> ...
end
我认为Anthony Ramine正在努力实施cond
。