Lets say I have a function f[x_, y_], and two lists l1, l2. I’d like to evaluate f[x,y] for each pair x,y with x in l1 and y in l2, and I’d like to do it without having to make all pairs of the form {l1[[i]],l2[[j]]}.
Essentially, what I want is something like Map[Map[f[#1, #2]&, l1],l2] where #1 takes values from l1 and #2 takes values from l2, but this doesn’t work.
(Motivation: I’m trying to implement some basic Haskell programs in Mathematica. In particular, I’d like to be able to code the Haskell program
isMatroid::[[Int]]->Bool
isMatroid b =and[or[sort(union(xs\\[x])[y]'elem'b|y<-ys]|xs<-b,ys<-b, xs<-x]
I think I can do the rest of it, if I can figure out the original question, but I’d like the code to be Haskell-like. Any suggestions for implementing Haskell-like code in Mathematica would be appreciated.)
To evaluate a function
fover all pairs from two listsl1andl2, useOuter:Outerby default works at the lowest level of the provided lists; you can also specify a level with an additional argument:Note that this produces a nested list; you can
Flattenit if you like.My original answer pointed to
ThreadandMapThread, which are two ways to apply a function to corresponding pairs from lists, e.g.MapThread[f,{a,b},{1,2}] == {f[a,1], f[b,2]}.P.S. I think as you’re learning these things, you’ll find the documentation very helpful. There are a lot of general topic pages, for example, applying functions to lists and list manipulation. These are generally linked to in the “more about” section at the bottom of specific documentation. This makes it a lot easier to find things when you don’t know what they’ll be called.