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

时间:2013-03-30 10:39:23

标签: 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]

但这似乎没有多大帮助。 最好的方法是什么?

3 个答案:

答案 0 :(得分:4)

您可以使用列表推导来说明在ghci下尝试以下表达式,

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

答案 1 :(得分:4)

没有列表推导的解决方案:

两次使用map

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

答案 2 :(得分:2)

您可以使用applicative functor以这种方式执行此操作:

import Control.Applicative
let l = ["a", "b", "c"]
(++) <$> l <*> l

这将返回["aa","ab","ac","ba","bb","bc","ca","cb","cc"]

为了进一步解释,(++) <$> l会在(++)的每个元素上映射函数l,从而返回[("a"++), ("b"++), ("c"++)]。然后,使用<*>会将所有这些功能应用于l的所有元素。

有关详细信息,请参阅有关applicative functors的文档。 http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control-Applicative.html