2008-12-18 34 views
3

比方說,我有以下功能:這些haskell函數的值來自哪裏?

sumAll :: [(Int,Int)] -> Int 
sumAll xs = foldr (+) 0 (map f xs) 
    where f (x,y) = x+y 

sumAll [(1,1),(2,2),(3,3)]結果將是12

我不明白的是(x,y)的值來自哪裏。那麼,我知道他們來自xs變量,但我不明白如何。我的意思是,做上面的代碼的情況下直接將其中的關鍵字,這將是這樣的:

sumAll xs = foldr (+) 0 (map (\(x,y) -> x+y) xs) 

而且我不明白,在上面的代碼,請問f變量和(x,y)變量代表(\(x,y) -> x+y) lambda表達式。

回答

5

在Haskell中,函數是第一類數據類型。

這意味着您可以像其他類型的數據(如整數和字符串)一樣傳遞函數。

在上面的代碼中,你聲明'f'是一個函數,它接受一個參數a(一個包含兩個值(x,y)的元組),並返回(x + y)的結果。

foldr是另一個函數,它接受3個參數,一個二元函數(在本例中爲+)一個起始值(0)和一個迭代器值的數組。

總之 '其中f(X,Y)= X + Y' 只是作用域爲

sumAll :: [(Int,Int)] -> Int 
sumAll xs = foldr (+) 0 (map myFunctionF xs) 

myFunctionF :: (Int,Int) -> Int 
myFunctionF (x,y) = x + y 

編輯速記:如果您不確定foldr相似的工作方式,檢查了Haskell Reference Zvon 下面是一個foldl/map的示例實現。

foldl :: (a -> b -> b) -> b -> [a] -> b 
foldl _ x [] = x 
foldl fx (y:ys) = foldl f (f y x) ys 

map :: (a -> b) -> [a] -> [b] 
map _ [] = [] 
map f (x:xs) = (f x) : (map f xs) 
6

希望這會有所幫助。關鍵是f應用於列表中的元素,它們是成對的。

sumAll [(1,1),(2,2),(3,3)] 
     -- definition of sumAll 
    = foldr (+) 0 (map f [(1,1),(2,2),(3,3)]) 
     -- application of map 
    = foldr (+) 0 (f (1,1) : map f [(2,2),(3,3)]) 
     -- application of foldr 
    = 0 + foldr (+) (f (1,1)) (map f [(2,2),(3,3)]) 
     -- application of map 
    = 0 + foldr (+) (f (1,1)) (f (2,2) : map f [(3,3)]) 
     -- application of foldr 
    = 0 + (f (1,1) + foldr (+) (f (2,2)) (map f [(3,3)])) 
     -- application of f 
    = 0 + (2 + foldr (+) (f (2,2)) (map f [(3,3)])) 
     -- application of map 
    = 0 + (2 + foldr (+) (f (2,2)) (f (3,3) : map f [])) 
     -- application of foldr 
    = 0 + (2 + (f (2,2) + foldr (+) (f (3,3)) (map f []))) 
     -- application of f 
    = 0 + (2 + (4 + foldr (+) (f (3,3)) (map f []))) 
     -- application of map 
    = 0 + (2 + (4 + foldr (+) (f (3,3)) [])) 
     -- application of foldr 
    = 0 + (2 + (4 + f (3,3))) 
     -- application of f 
    = 0 + (2 + (4 + 6)) 
    = 0 + (2 + 10) 
    = 0 + 12 
    = 12 
3

不是一個答案,但我想我應該指出的是,你的函數f:

f (x, y) = x + y 

可以表示爲

f = uncurry (+)