2016-04-24 4 views
0

In Haskell, kann ich die folgenden Lambda-Ausdruck nehmen:Wie man ein Lambda mit 2 Parametern auf eine Liste in Haskell anwendet?

\x y -> x * y 

und wenden Sie es mögen:

(\x y -> x * y) 9 9 
81 

(\x y -> x * y) 8 8 
64 

Wenn ich so etwas zum Ausdruck bringen wollen, „Nehmen Sie die oben Lambda, und wo es sich über eine Liste, wobei jedes Element ein Wertepaar wie oben ist und eine Liste zurückgibt, wobei jeder Wert das Ergebnis der Anwendung dieses Lambda-Ausdrucks ist ", wie kann ich das tun?

In Pseudo-Code meine ich so etwas wie: Nehmen Sie (\x y -> x * y) und wenden Sie es an etwas wie [(9, 9), (8, 8)].

Ich weiß, dass, wenn ich \x -> x + 1 habe, habe ich folgendes tun:

map (\x -> x + 1) [9, 9, 9] 
[10,10,10] 

Mit anderen Worten, ich versuche, herauszufinden, ob es möglich ist, (und wie) so etwas wie

zu tun
map (\x y -> x * y) [ a list of items, each being a pair of values, on which the lambda can work ] 

Offenbar hat folgendes nicht:

map (\x y -> x * y) [(9, 9), (8, 8)] 

es nicht 012.358 zurückkehrt. Gibt es eine Möglichkeit, das zu tun?

Antwort

12
let list = [(9, 9), (8, 8)] 
-- if you want to do it inline 
map (\(x, y) -> x * y) list 
-- or if you already have a 2 parameter version of a function 
let f x y = x * y 
uncurry :: (a -> b -> c) -> ((a, b) -> c) 
map (uncurry f) list 

Es gibt einen Unterschied zwischen \(x, y) -> x * y :: (Int, Int) -> Int und \x y -> x * y :: Int -> Int -> Int.

Die erste ist eine Funktion, die einen Parameter - ein Tupel nimmt und das Ergebnis der Multiplikation zurückgibt.

Die zweite ist eine Funktion, die zwei Parameter akzeptiert und das Ergebnis der Multiplikation zurückgibt.

+0

Oder mit anderen Worten 'map (uncurry (\ x y -> x * y)) [(9, 9), (8, 8)]' zu erhalten '[81, 64]'. Vielen Dank! :) –

+2

Das funktioniert, aber Sie würden es normalerweise als 'Karte schreiben (\ (x, y) -> x * y) [(9, 9), (8, 8)]'. Da '(*) :: Int -> Int -> Int 'auch eine binäre Funktion ist, ist es auch möglich, es als' map (uncurry (*)) [(9, 9), (8, 8)] 'zu schreiben , aber ich bevorzuge die obige Version. – niteria

Verwandte Themen