LINUX.ORG.RU

[ocaml] аргументы функции

 


0

0

В окамле функцию с двумя аргументами можно определить как
( 'a -> 'b -> 'c ) или же как ( 'a * 'b -> 'c ), и особой разницы между
этими способами нет.

В каких случаях один из способов может быть предпочтительнее?
(если не беспокоиться об эффективности байткод-интерпретатора)

Единственное что приходит в голову, это если я хочу написать
что-нибудь вроде map f (zip list_a list_b),
где zip устроен как в питоне (zip : 'a list -> 'b list -> 'a*'b list).
Но на такой случай предусмотрено List.map2

anonymous

Ответ на: комментарий от imp

ну это-то все понятно, мне интересно, бывают ли ситуации когда ипользовать один tuple-аргумент удобнее чем 'a -> 'b -> 'c ?

(c:fateyed охуенная)

anonymous
()
Ответ на: комментарий от anonymous

>ну это-то все понятно, мне интересно, бывают ли ситуации когда ипользовать один tuple-аргумент удобнее чем 'a -> 'b -> 'c ?

Ты же сам его привел - вывод - бывают.

Вообще в окамле предпочитают делать функции некаррированными, а например в Standard ML и Haskell каррированными. Это больше вопрос стиля.

imp ★★
()

> В окамле функцию с двумя аргументами можно определить как ( 'a -> 'b -> 'c ) или же как ( 'a * 'b -> 'c ), и особой разницы между этими способами нет.

Разница огромная. Второй вариант - функция одного аргумента, кортежа из 'a и 'b. Первый вариант - функция одного аргумента типа 'a, возвращающая функцию одного аргумента типа 'b, то есть, для неё работает карринг.

Например, для функции let add (a,b) = a+b мы не можем написать List.map (add 2) something, а для let add a b = a + b (что тождественно let add = fun a -> fun b -> a + b) таки можно.

anonymous
()

> Но на такой случай предусмотрено List.map2

map - далеко не единственный вариант применения карринга. Посмотри на комбинаторы, например.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.