Elixir:模式匹配特定类型的列表?

dsi*_*gnr 4 elixir

我有一个任意大小的结构列表.

我们称之为l.

l = [%X{a:1}, %X{a:3}, %X{a:9}, %X{a:11}]

大小l不断变化.我想知道的是我如何模式匹配l以确保它总是由结构组成%X{}.如果列表包含其他内容,我希望模式匹配失败.例如:

l = [%X{a:1}, %X{a:3}, %Y{a:9}, %Z{a:11}]

我尝试过的事情

i = %X{}
j = %Y{}

[%X{}|_] = [i,i,i]
Run Code Online (Sandbox Code Playgroud)

但这只匹配第一个元素.

[%X{}|_] = [i,j,j]
Run Code Online (Sandbox Code Playgroud)

我的用例应该失败,但事实并非如此.也许如果有一个运算符或类似的东西,它将匹配特定类型的列表,这正是我正在寻找的:

[%X{}+] = [i,i,i] # Doesn't exist, just an example
Run Code Online (Sandbox Code Playgroud)

一些背景

我在菲尼斯,我有一个post与之has_many关系的模特images.给定的用户可以上传多个图像,我想模式匹配,以确保我%Plug.Upload{}在这种情况下使用正确的struct().

任何帮助深表感谢.谢谢 :)

Dog*_*ert 5

您不能在列表的每个元素上进行模式匹配(没有递归).在这种情况下,我会使用Enum.all?/2match?/2宏:

if Enum.all?(list, &match?(%X{}, &1)) do
  ...
end
Run Code Online (Sandbox Code Playgroud)