2017-03-05 90 views
0

我有元组的列表:药剂列表理解

m=[{5, 3}, {6, 6}, {7, 10}] 

现在我想创建第二个列表,从而为内部M值的每个元组,我将插入“A”,如果第一个值>第二值, “B”如果首先是<秒。因此,在这种情况下,列表将导致[“A”,“B”(因为5> 3和7 < 10) 我用下面的代码:

res= for {u,v} <- m do if u>v do "A" end 
         if u<v do "B" end 
        end 

然而它导致了以下内容:

[nil, nil, "B"] 

我无法弄清楚什么是错误的?在此先感谢

回答

2

我无法弄清楚什么是错的?

你的第一if表达是由编译器完全忽略了,因为你有之后的另一种表达(如果你编译这个混音中的项目,你应该得到一个警告)。 Elixir只返回最后一个表达式的值,在本例中为"B"u < v)或nil

您可以使用elseifcond使这里有一个在do只有一个表达式:

res = for {u,v} <- m do 
    if u > v do 
    "A" 
    else 
    "B" 
    end 
end 

res = for {u,v} <- m do 
    cond do 
    u > v -> "A" 
    u < v -> "B" 
    end 
end 

注意,第一个将返回"B"如果u == v和如果是u == v,第二个会引发异常。我不确定你想要哪一个。

+0

谢谢。其实我想忽略你== == v。我已经尝试了第一种解决方案,但它包含了我只想忽略的平等案例。 –

+0

其实我解决了我的问题。我只想计算第二个列表中的As和Bs的数量,所以在cond中,我只是为u == v添加了一个不同的条件。非常感谢。 –

+0

for-comprehensions也可以过滤,所以如果你只是想忽略'u == v',你可以添加过滤器'u!= v'。因此,对于{u,v} < - m,u!= v,做:if(u> v do:“A”,else:“B”)' –