Elixir 使用列表理解生成潜在组合

Elixir 使用列表理解生成潜在组合,elixir,Elixir,我需要生成一组序列数据,其中包含一些已经确定的值,以便根据算法进行测试。数据示例数据看起来像[“苹果”、“橙色”、“苹果”、“无”、“菠萝”、“无],我需要为每个零点计算苹果、橙色和菠萝的每个组合,例如,在本例中,我需要一个 [ ["apple", "orange", "apple", "apple", "pineapple", "apple"], ["apple", "orange", "apple", "orange", "pineapple", "apple"], ["appl

我需要生成一组序列数据,其中包含一些已经确定的值,以便根据算法进行测试。数据示例数据看起来像
[“苹果”、“橙色”、“苹果”、“无”、“菠萝”、“无]
,我需要为每个零点计算苹果、橙色和菠萝的每个组合,例如,在本例中,我需要一个

[
  ["apple", "orange", "apple", "apple", "pineapple", "apple"],
  ["apple", "orange", "apple", "orange", "pineapple", "apple"],
  ["apple", "orange", "apple", "pineapple", "pineapple", "apple"],
  ["apple", "orange", "apple", "apple", "pineapple", "orange"],
  ["apple", "orange", "apple", "orange", "pineapple", "orange"],
  ...
]
我目前正在尝试使用列表理解的递归方法,但我们公司刚刚开始使用长生不老药,我还不熟悉它是如何组合在一起的

我有一个名为
generate_sample_data
的方法,它获取一个数据列表和一个累加器(列表列表)

def生成样本数据(列表,有效列表\\[])执行
案例枚举。查找索引(列表,fn(f)->f==nil end)do
无->[列表|有效列表]
索引->
对于x列表。更新位置(索引,fn()->x结束)
|>枚举每个(&生成样本数据/2)
结束
结束
结束
但是我得到了一个错误
#函数,它的arity2用一个参数(“apple”)调用


我不知道如何正确地将这些组合从列表理解转化为列表列表。无论我尝试什么,似乎都会给我带来不同的错误,但我觉得我有点接近了。

在您的特殊情况下,问题在于:

|> Enum.each(&generate_sample_data/2)
这是试图调用
generate_sample_data/2
传递唯一参数(来自管道的列表)

另外,
Enum.each/2
在这里没有任何意义,因为您基本上是在迭代上一步创建的有效列表的元素

另一个潜在的问题是在子句
nil->[list | acc]
中使用从未定义的
acc
局部变量


FWIW,以下是生成初始列表所有排列的宏:

defmacro permutations(l, n) do
  clause = fn i -> {:<-, [], [{:"i#{i}", [], Elixir}, l]} end
  return = Enum.map (1..n, fn i -> {:"i#{i}", [], Elixir} end)
  Enum.reduce(1..n, return, fn i, acc ->
    {:for, [], [clause.(i), [do: acc]]}
  end)
end
defmacro置换(l,n)do
子句=fn i->{:{:“i{i},[],长生不老药}end)
枚举减少(1..n,返回,fn i,acc->
{:对于,[],[第(i)款,[do:acc]]}
(完)
结束

这是一个完美的属性测试用例。这是最好的方法。
defmacro permutations(l, n) do
  clause = fn i -> {:<-, [], [{:"i#{i}", [], Elixir}, l]} end
  return = Enum.map (1..n, fn i -> {:"i#{i}", [], Elixir} end)
  Enum.reduce(1..n, return, fn i, acc ->
    {:for, [], [clause.(i), [do: acc]]}
  end)
end