我如何使用函数式编程技术让Mathematica在两个列表上构建一个2变量函数?

Lea*_*man 4 haskell functional-programming wolfram-mathematica

让我说我有一个功能f[x_, y_],两个列表l1,l2.我想用in 和in 来评估f[x,y]每一对,我想做不必制作所有形式的对.x,yxl1yl2{l1[[i]],l2[[j]]}

基本上,我想要的是Map [Map [f [#1,#2]&,l1],l2],其中#1从l1获取值,#2从l2获取值,但这不起作用.

(动机:我正在尝试在Mathematica中实现一些基本的Haskell程序.特别是,我希望能够编写Haskell程序的代码

isMatroid::[[Int]]->Bool
isMatroid b =and[or[sort(union(xs\\[x])[y]'elem'b|y<-ys]|xs<-b,ys<-b, xs<-x]
Run Code Online (Sandbox Code Playgroud)

如果我能找到原始问题,我想我可以完成剩下的工作,但我希望代码能像Haskell一样.任何在Mathematica中实现类似Haskell的代码的建议都将受到赞赏.)

Cas*_*bel 9

为了评估功能f从两个列表在所有对l1l2使用Outer:

In[1]:=  Outer[f, {a,b}, {x,y,z}]
Out[1]:= {{f[a,x],f[a,y],f[a,z]}, {f[b,x],f[b,y],f[b,z]}}
Run Code Online (Sandbox Code Playgroud)

Outer默认情况下,在提供的列表的最低级别工作; 您还可以使用其他参数指定级别:

In[2]:=  Outer[f, {{1, 2}, {3, 4}}, {{a, b}, {c, d}}, 1]
Out[2]:= {{f[{1,2},{a,b}], f[{1,2},{c,d}]}, {f[{3,4},{a,b}], f[{3,4},{c,d}]}}
Run Code Online (Sandbox Code Playgroud)

请注意,这会生成嵌套列表; Flatten如果你愿意,你可以.

我原来的答复指出,ThreadMapThread,这是一个功能应用到相应的列表,如对两种方式MapThread[f,{a,b},{1,2}] == {f[a,1], f[b,2]}.

PS我认为,当你学习这些东西时,你会发现文档非常有用.有很多一般主题页面,例如,将函数应用于列表列表操作.这些通常与特定文档底部的"更多关于"部分相关联.这使得当你不知道它们将被称为什么时,更容易找到它们.