3

私が次の機能を持っているとしましょう:

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方法がわかりません。上記のコードを where キーワードなしで直接実行すると、次のようになります。

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

fそして、上のコードでは、変数と(x,y)変数が(\(x,y) -> x+y)ラムダ式をどのように表しているのか理解できません。

4

3 に答える 3

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
于 2008-12-18T05:41:11.637 に答える
5

Haskell では、関数はファースト クラスのデータ型です。

これは、整数や文字列などの他のタイプのデータと同じように関数を渡すことができることを意味します。

上記のコードでは、'f' を関数として宣言しています。この関数は、1 つの引数a (2 つの値 (x,y) のタプル) を取り、(x + y) の結果を返します。

foldr は、2 項関数 (この場合は +)、開始値 (0)、およびイテレータの値の配列の 3 つの引数を取る別の関数です。

要するに、「where 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)
于 2008-12-18T05:31:08.067 に答える
3

答えではありませんが、あなたの関数 f:

f (x, y) = x + y

次のように表現できます。

f = uncurry (+)
于 2008-12-19T22:15:08.783 に答える