list - erlang列表理解问题

标签 list erlang list-comprehension

我正在尝试计算一个方程式 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/

相关文章:

ios - Realm AddOrUpdate 一个带有对象列表的对象覆盖后面的对象

Python-使用列表作为函数参数

mongodb - 在 Erlang 中创建和修改 MongoDB 中的映射

Python:使用列表列表进行列表理解

python - 在 Python 中列出具有任意数量变量的理解?

python - Zip 作为列表理解

python - 如何获得多个列表的笛卡尔积

java - 初始化动态类型的ArrayList

erlang - 用于为Erlang系统建模的工具

macros - 如何更改 "-define"Erlang 属性(宏定义)的值?