Haskell - Карри? Нужны дальнейшие объяснения - PullRequest
5 голосов
/ 25 сентября 2010

Так что-то вроде

addList :: [int] -> int
addList = foldl1 (+)

Почему это работает? Карри часть. Почему нет переменной?

Ответы [ 3 ]

11 голосов
/ 25 сентября 2010

Если вы определяете функцию типа f x y = bla, это то же самое, что и f x = \y -> bla, что совпадает с f = \x -> (\y -> bla). Другими словами, f - это функция, которая принимает один аргумент, x, и возвращает другую функцию, которая принимает один аргумент, y, а затем возвращает фактический результат. Это известно как карри.

Аналогично, когда вы делаете f x y, оно совпадает с (f x) y. То есть Вы вызываете функцию f с аргументом x. Это возвращает другую функцию, которую вы применяете к аргументу y.

Другими словами, когда вы делаете addList xs = foldl1 (+) xs, вы сначала вызываете foldl1 (+), который затем возвращает другую функцию, которую вы применяете к xs. Так как функция, возвращаемая foldl1 (+), фактически совпадает с addList, вы можете просто сократить ее до addList = foldl1 (+).

5 голосов
/ 25 сентября 2010

Помимо карри, как указал sepp2k, здесь мы используем так называемое eta сокращений .Это одно из правил сокращения лямбда-исчисления, которое является основой Haskell.В нем говорится, что \x -> f x эквивалентно f, когда x не отображается в f.

. Позволяет применить его к вашему делу.Я полагаю, что вам подходит определение типа addList xs = foldl1 (+) xs.Мы можем переписать это как addList = \xs -> foldl1 (+) xs и теперь, применяя правило сокращения eta, получаем addList = foldl1 (+).

Это правило основано на идее, что две функции равны, если они дают равные результаты при применении к одним и тем же аргументам,Здесь есть две функции: f и g = \x -> f x, где f : a -> b, и мы хотим показать это для всех c : a, f c = g c.Чтобы доказать, что нужно взять произвольный c : a и применить его к g: g c = (\x -> f x) c = f c, последним равенством является другое правило, называемое бета-редукцией, которое говорит, что применение функции оценивается путем подстановки.

2 голосов
/ 25 сентября 2010

Объяснение из sepp2k правильное, я просто хочу отметить (каламбур), что у этого приложения карри есть имя: оно называется «стиль без точек».Вот хорошее объяснение, включая плюсы и минусы: http://www.haskell.org/haskellwiki/Pointfree

...