карри и нетуширные функции - PullRequest
2 голосов
/ 09 июля 2011

Curried

add::Int->Int->Int
add x y = x+y

Нет,

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

У меня есть несколько проблем при обновлении Curried и Uncurried функция, рассмотрите функции выше,

Вопрос 1

в Uncurried функции входные параметры равны (Int,Int), так что это эквивалентно входу кортеж ? как мы можем это дифференцировать?

Вопрос 2

Каковы плюсы и минусы в отношении функций без карри и карри? Когда и почему что следует использовать?

Ответы [ 2 ]

9 голосов
/ 09 июля 2011

в Uncurried функции входные параметры как (Int, Int), так что это эквивалентно входному кортежу?как мы можем это дифференцировать?

Это не только эквивалентно, но является кортежем.Итак, add1 - это функция, которая принимает пару (2 кортежа) чисел Ints и возвращает Int.

Какие плюсы и минусы в отношении функций без курари и карри?и где их использовать?

Как правило, я бы сказал: всегда используйте функции карри, если у вас нет веских причин не делать этого.У них есть приятная особенность: их можно частично применить, например, вы можете написать f = add 1, где f теперь имеет тип f :: Int -> Int и всегда добавляет 1 к своему аргументу.

Это имеет много приложений и очень распространено в Haskell, потому что это так удобно.Например, функция, которая добавляет 1 ко всем элементам в списке, будет просто map (add 1).

Кроме того, синтаксис намного менее шумный.

4 голосов
/ 09 июля 2011

Мне нравится ответ @ bzn, но я хотел бы привести несколько примеров, когда полезные функции не используются.

Некоторые библиотеки интенсивно используют кортежи данных. Одним из примеров является Gtk2hs, который использует кортеж (Int, Int) для размеров окна и определенных координат. Поэтому, когда я работаю с gtk2hs, я часто пишу функции в неиспользуемой форме, поэтому мне не нужно вручную распаковывать кортеж.

Также помните, что функция может возвращать только один результат. Чтобы вернуть более одного значения, все результаты должны быть упакованы в кортеж. uncurry тогда полезно для создания композиций из этих функций. Вот упрощенный пример из проекта, над которым я работаю:

addIndex :: MyData -> (Int, MyData)

normalize' :: Int -> MyData -> [(Int, MyData)]

normalize :: [MyData] -> [(Int, MyData)]
normalize = concatMap (uncurry normalize' . addIndex)

Я обычно предпочитаю писать функции в форме карри, но здесь мне понадобилась нетипичная версия normalize', чтобы сочинять с addIndex.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...