再一次理解Erlang列表

再一次理解Erlang列表,erlang,list-comprehension,Erlang,List Comprehension,我正在尝试让列表理解工作,其目的是验证list中的每个元素X后面跟着X+Incr(或空列表)。稍后,我将使用该列表并将其与使用lists:seq(From,To,Incr)生成的列表进行比较。 目的是练习编写测试用例和发现测试属性 我已经完成了以下步骤: 1> List. [1,3,5,8,9,11,13] 2> Incr. 2 3> List2=[X || X <- List, (tl(List) == []) orelse (hd(tl(List)) == X + I

我正在尝试让列表理解工作,其目的是验证
list
中的每个元素
X
后面跟着
X+Incr
(或空列表)。稍后,我将使用该列表并将其与使用
lists:seq(From,To,Incr)
生成的列表进行比较。 目的是练习编写测试用例和发现测试属性

我已经完成了以下步骤:

1> List.
[1,3,5,8,9,11,13]
2> Incr.
2
3> List2=[X || X <- List, (tl(List) == []) orelse (hd(tl(List)) == X + Incr)].
[1]
1>列表。
[1,3,5,8,9,11,13]
2> 增量。
2.

3> List2=[X | | X也许我误解了你,但是列表理解应该是这样的。下面是一种使用列表理解而不使用
列表生成列表的方法:seq

> Start = 1, Inc = 2, N = 6.
6
> [Start + X*Inc || X <- lists:seq(0,N)].
[1,3,5,7,9,11,13]
>Start=1,Inc=2,N=6。
6.

>[Start+X*Inc | | X列表理解的问题是
list
总是指整个列表。因此,此条件只允许那些
X
等于
list
的第二个元素减去
Incr

(hd(tl(List)) == X + Incr)
第二个元素始终为3,因此此条件仅适用于X=1

列表理解不能“向前看”其他列表元素,因此这可能应该作为递归函数编写:

check_incr([], _Incr) ->
    true;
check_incr([_], _Incr) ->
    true;
check_incr([A, B | Rest], Incr) ->
    A + Incr == B andalso check_incr([B | Rest], Incr).

你可以这样做:

> lists:zipwith(fun (X, Y) -> Y - X end, [0 | List], List ++ [0]).
[1,2,2,2,2,2,2,-13]

然后检查所有元素是否都等于
Incr
,除了第一个元素应该等于
From
,最后一个元素应该大于或等于
-to

一个快速的注释是,在评估理解时,
列表的值没有变化,它总是指i初始列表。它是
X
,用于遍历列表中的所有元素。这意味着您的测试将始终引用列表中的第一个元素。由于列表理解在某个时间为您提供列表中的元素,因此当您想要比较列表中的元素时,它通常不是一个好工具


列表理解无法查看您需要的连续子列表(如CommonLisp中的MAPLIST).

是的,生成列表不是问题。问题是检查列表是否满足以下条件:对于每个元素X,下一个元素是X+Incr还是空列表。那么,列表理解可能是错误的工具,因为您无法查看相邻元素?我认为您是对的…理解不是正确的ol!是的……当然。愚蠢的我(;我想理解不是正确的工具,就像安德烈·拉兹洛说的那样……我将实现一个助手函数,就像上面提到的注释一样。假设这是最简单的方法!