2013-03-30 5 views
2

У меня есть функцияПрименить функцию двух входов для каждого элемента в списке - Haskell

f :: Int -> Int -> Int 

и у меня есть список произвольной длины, но для примера:

[x1,x2,x3] 

мне нужно применить е к списку таким образом, что результирующий список выглядит следующим образом:

[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] 

, но это не похоже на помощь. Каков наилучший способ сделать это?

+0

Возможно, вы ищете [складки] (http://www.haskell.org/haskellwiki/Fold)? –

+1

'appSum = (сумма). присоединиться . liftM2' – is7s

ответ

4

Вы можете использовать список понимание, чтобы проиллюстрировать попробовать следующее выражение под GHCI,

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

'foldl1 (+)' == 'sum' –

+0

помните, что я не знаю длины списка. 3 только пример – MinaHany

+0

должен быть в порядке, это должно было проиллюстрировать – zurgl

4

Раствор без списковых:

Используйте map дважды.

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

Вы можете использовать аппликативные функторы сделать это следующим образом:

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.

Подробнее см. Документацию об аппликативных функторах. http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control-Applicative.html

+1

Это не решает проблему. –

Смежные вопросы