我正在尝试计算一个方程式 f(Ys) -> [Y * 2 || Y <- Ys, Y < 4].
.
当我输入列表时 f([5,1,2,6]).
我得到的结果是 [2,4]
虽然我认为它应该是 [10, false]
,源自 f([5,1,2,6]) -> [5 * 2 || 5 <- [1,2,6], 5 < 4]
.
谁能告诉我我在哪里做错了,或者可以通过正确的过程了解如何获得正确的结果?
最佳答案
列表理解[Y * 2 || Y <- Ys, Y < 4]
直接相当于对列表进行筛选,然后然后乘法。考虑到您不能乘以 false * 2
即使那是列表理解中的守卫的意思。
过滤器测试 看起来像fun(Y) -> Y < 4 end
,只返回一个 bool 值:
-spec my_test(integer()) -> boolean().
my_test(Y) -> Y < 4.
要将其组合成返回 bool 值或整数的函数,您需要一些不同的东西:
-spec multiply_or_false(integer()) -> integer() | false.
multiply_or_false(Y) ->
case Y < 4 of
true -> Y * 2;
false -> false
end.
这是一个比较然后一个基于返回 false
的结果的分支或整数。
如果您确实想返回一个加倍或 bool 值,您可以在映射或列表理解中使用上面的 multiply_or_false/1 之类的东西(在这种情况下它们完全等价):
[multiply_or_false(Y) || Y <- Ys].
或
lists:map(fun multiply_or_false/1, Ys).
有时强制自己将代码的元素分解成微小的函数并规范它们只是为了弄清楚你脑子里到底在想什么(不管代码最终是否保持那种形式)是有用的。
关于list - erlang列表理解问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34590514/