【问题标题】:Erlang: Mixing lists:seq with pattern matchingErlang:混合列表:seq 与模式匹配
【发布时间】:2013-03-09 22:05:42
【问题描述】:

我再次需要你的帮助。我想知道是否可以在模式匹配中使用 lists: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

lists:seq 是否适用于大小写?

让我用更简单的方式解释一下。我有以下情况

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

如果我将输入设为 1125,我希望输出为 Apples。同样,如果我将输入设为 1450,我希望输出为香蕉。我希望你们明白,我想达到什么目的!

【问题讨论】:

  • 你肯定不想匹配一个有一百个元素的列表。你的例子就是这个意思。但是您似乎需要列表中的参数成员资格。

标签: erlang


【解决方案1】:

如果我正确解释了您想要达到的目标,那么您可能正在寻找的是守卫。

类似这样的东西(未经测试):

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;
[...]

【讨论】:

  • 我猜,您建议的解决方案是前进的方向!谢谢!
  • 好的,当我使用“andalso”时出现语法错误。我错过了什么吗? product_selling_price_evaluate(productcode,standard_produce,Costprice) when productcode &gt;= 1100 andalso productcode &lt;= 1199 -&gt; Costprice*10;
  • 好了,整理好了应该product_selling_price_evaluate(Productcode,standard_produce,Costprice) when Productcode &gt;=1100, Productcode =&lt; 1199 -&gt; Costprice + Costprice*0.40;
【解决方案2】:

您没有提供所需的输入,您的函数需要一个 list([11001,1101, 1102,...,1189,1190]) 作为它的第一个参数,而您提供的是一个数字,即 1100 .

【讨论】:

  • 哦,那我不应该在那里使用 lists:seq !谢谢
【解决方案3】:

守卫可以用逗号分隔(,),与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;
...

&lt;= 在这里是非法的,请改用=&lt;

【讨论】:

  • 哦,说的对,我终于找到了!不过谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-04-09
  • 2019-05-26
  • 1970-01-01
  • 2014-06-27
  • 2011-11-10
  • 2012-06-08
  • 2018-12-08
  • 2011-08-14
相关资源
最近更新 更多