List 将两个输入函数应用于列表中的每个元素-Haskell

List 将两个输入函数应用于列表中的每个元素-Haskell,list,function,haskell,List,Function,Haskell,我有一个函数 f :: Int -> Int -> Int 我有一个任意长度的列表,但为了示例: [x1,x2,x3] 我需要将f应用于列表,以便生成的列表如下所示: [f x1 x1 + f x1 x2 + f x1 x3 , f x2 x1 + f x2 x2 + f x2 x3 , f x3 x1 + f x3 x2 + f x3 x3] 我知道 map f [x1,x2,x3] will give [f x1, f x2, f x3] 但这似乎帮不了什么忙。 最好的方

我有一个函数

f :: Int -> Int -> Int
我有一个任意长度的列表,但为了示例:

[x1,x2,x3]
我需要将f应用于列表,以便生成的列表如下所示:

[f x1 x1 + f x1 x2 + f x1 x3 , f x2 x1 + f x2 x2 + f x2 x3 , f x3 x1 + f x3 x2 + f x3 x3]
我知道

map f [x1,x2,x3] will give [f x1, f x2, f x3]
但这似乎帮不了什么忙。
最好的方法是什么?

您可以使用列表理解来说明,在ghci下尝试以下表达式:

fun f xs = map sum [[ f x y | y <- xs] |  x <- xs]

fun f xs=map sum[[f x y | y没有列表理解的解决方案:

使用
map
两次

map (\x -> sum $ map (f x) xs) xs

可以使用应用程序函子以这种方式执行此操作:

import Control.Applicative
let l = ["a", "b", "c"]
(++) <$> l <*> l
导入控件。应用程序
设l=[“a”,“b”,“c”]
(++)l
这将返回
[“aa”、“ab”、“ac”、“ba”、“bb”、“bc”、“ca”、“cb”、“cc”]

为了进一步解释,
(++)l
将函数
(++)
映射到
l
的每个元素上,从而返回
[((“a”+),(“b”+),(“c”++)]
。然后,使用
将所有这些函数应用到
l
的所有元素上


有关更多详细信息,请参阅有关应用程序函子的文档。

也许您正在寻找?
appSum=(sum.).join.liftM2
请记住,我不知道列表的长度。3只是一个示例,应该可以,它是用来演示使用列表理解的
map
/
filter
使它们在我看来都更复杂。
fun f xs=[sum][f x y | y映射根据定义映射列表上的函数,列表理解只是一个列表,那么将它们关联起来就不那么复杂了。当我们将lc嵌套到lc中时,它开始变得很棘手。这里我们有两个层次的重叠,从三开始。我同意使用列表理解不是一个好的选择,需要修复。即使我不觉得列表理解在语法上很优雅,而且您提供的解决方案imo更优雅,但第一眼就很难领会