Pregunta

Vamos a decir que tengo la siguiente función:

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

será sumAll [(1,1),(2,2),(3,3)] El resultado de 12.

Lo que no entiendo es donde los valores (x,y) están viniendo. Bueno, sé que vienen de la variable xs pero no entiendo cómo. Es decir, haciendo el código anterior directamente sin la palabra clave, donde, sería algo como esto:

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

Y no puedo entender, en el código de arriba, ¿cómo la variable f y las variables (x,y) representan la expresión (\(x,y) -> x+y) lambda.

¿Fue útil?

Solución

En Haskell, las funciones son tipos de datos de primera clase.

Esto significa que puede pasar funciones en torno al igual que otros tipos de datos, tales como enteros y cadenas.

En el código anterior se declara 'f' a ser una función, que tiene en uno argumenta (una tupla de dos valores (x, y)) y devuelve el resultado de (x + y).

foldr es otra función que toma en 3 argumentos, una función binaria (en este caso +) un valor de partida (0) y una matriz de valores para iterador sobre.

En resumen 'donde f (x, y) = x + y' es sólo de ámbito de taquigrafía para

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

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

Editar : Si su seguro de cómo funciona foldr, echa un vistazo a Haskell Referencia Zvon A continuación se muestra un ejemplo de implementación foldl / mapa.

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)

Otros consejos

Esperamos que esto ayudará. La clave es que f se aplica a los elementos de la lista, que son pares.

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

No es una respuesta, pero pensé que debería señalar que su función f:

f (x, y) = x + y

puede ser expresado como

f = uncurry (+)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top