Erlang:混合列表:seq与模式匹配

时间:2013-03-08 19:44:21

标签: erlang

我需要你的帮助。我想知道是否可以在模式匹配中使用列表:seq(from,to)?以下是我想要实现的代码

product_selling_price_evaluate(lists:seq(1100,1190),standard_produce,Costprice) -> Costprice*10;
product_selling_price_evaluate(lists:seq(1200,1300),standard_produce,Costprice) -> Costprice*20;
product_selling_price_evaluate(lists:seq(1400,1500),standard_produce,Costprice) -> Costprice*30;
product_selling_price_evaluate(lists:seq(1600,1700),standard_produce,Costprice) -> 40*Costprice.

当我编译代码时,它给我一个非法的模式错误!

示例输入

selling_price:product_selling_price_evaluate(1100,standard_produce,10).

我希望它找到第一个作为匹配并将输出作为

100

会列出:seq与案例一起工作吗?

让我以更简单的方式解释。我有以下案例

1100 to 1190   = Apples
1200 to 1300   = Oranges
1400 to 1500   = Bananas
1600 to 1700   = Berries

如果我将输入设为1125,我希望输出为苹果。再次,如果我将输入作为1450,我希望输出为香蕉。我希望你们明白,我想要实现的目标!

3 个答案:

答案 0 :(得分:3)

如果我正确地解释你想要实现的目标,你可能正在寻找的是守卫。

像这样(未经测试):

product_selling_price_evaluate(N,standard_produce,Costprice) when N >= 10 andalso N <= 20 -> Costprice*10; 
product_selling_price_evaluate(N,standard_produce,Costprice) when N >= 21 andalso N <= 30 -> Costprice*20;
[...]

答案 1 :(得分:1)

你没有提供所需的输入,你的功能是期待一个列表([11001,1101,1102,...,1189,1190])作为它的第一个参数,你给出一个数字,即1100

答案 2 :(得分:0)

Guards可以是逗号分隔(,),它与andalso具有相同的含义。

product_selling_price_evaluate(N,standard_produce,Costprice)
    when 10 =< N, N =< 20 -> Costprice*10; 
product_selling_price_evaluate(N,standard_produce,Costprice)
    when 21 =< N, N =< 30 -> Costprice*20;
...

<=在此非法,请改用=<