Где тезисы значения получены от этой функции Haskell?

голоса
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переменных , но я не понимаю , как. Я имею в виду, делая код выше , непосредственно без где ключевое слово, было бы что - то вроде этого:

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

И я не могу понять, в верхнем коде, как делает fпеременную и (x,y)переменные представляют (\(x,y) -> x+y)лямбда - выражения.

Задан 18/12/2008 в 06:17
источник пользователем
На других языках...                            


3 ответов

голоса
5

В Haskell функции первые типы данных класса.

Это означает, что вы можете передать функции вокруг, как и другие типы данных, такие как целые числа и строки.

В коде выше вы объявляете «F» является функция, которая принимает в одном Argumenta (кортеж из двух значений (х, у)) и возвращает результат (х + у).

foldr другая функция, которая принимает в 3-х аргументах, двоичную функцию (в данном случае +) начальное значение (0) и массив значений итератора.

Короче «где Р (х, у) = х + у» просто сокращение для области видимости

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

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

Edit : Если не знаете о том , как foldr работает, проверьте Haskell Reference ZVON Ниже приведен пример реализации foldl / карты.

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)
Ответил 18/12/2008 в 06:31
источник пользователем

голоса
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
Ответил 18/12/2008 в 06:41
источник пользователем

голоса
3

Не ответ, но я думал, что я должен указать, что функция F:

f (x, y) = x + y

может быть выражена как

f = uncurry (+)
Ответил 19/12/2008 в 23:15
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more