我想要一个功能
foo :: (a → b → c) → [a] → [b] → [[c]]
它接受一个函数f :: a → b → c
和两个列表xs
,ys
并返回一个网格(即列表列表),其中包含f
应用于 和 的每个值组合的xs
值ys
。
示例:foo [1..3] [4..6]
应该返回
[[f 1 4,f 1 5,f 1 6],
[f 2 4,f 2 5,f 2 6],
[f 3 4,f 3 5,f 3 6]]
我目前的做法是
foo = traverse . flip . traverse . flip
这可行,但我想知道是否有其他方法或预定义的组合器可以更好地完成(或者甚至可以组合,以便它可以轻松地扩展到三元或 n 元函数)
例如:如果我不想要结果网格而只想要结果列表,我可以编写f <$> xs <*> ys
简洁的 ,使用预定义的组合子,并以明显的方式泛化到 n 元函数。是否有类似简洁的方式来编写我的组合器?