erlang中的cond样式语句

时间:2014-02-09 13:26:21

标签: erlang lisp case

来自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 

1 个答案:

答案 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