Почему эта функция карри? - PullRequest
       21

Почему эта функция карри?

0 голосов
/ 22 октября 2018

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

fun zipWith f xs ys =
    case (xs,ys) of
         ([],_) => []
      | (_,[]) => []
      | (x::xs',y::ys') => (f(x,y)) :: zipWith f xs' ys'

Тип:

val zipWith = fn : ('a * 'b -> 'c) -> 'a list -> 'b list -> 'c list.

Может кто-нибудь объяснить тип и как карри работает в этой функции.Любая помощь приветствуется!

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Он каррируется - вам не нужно передавать все аргументы сразу, но он генерирует список, когда все они "прибыли".
Обычно записывают все параметры карри слевасторона, если функция не предназначена для того, чтобы быть в первую очередь «функцией создания функции».

Определение больше похоже на тип, если вы напишите его в (эквивалентной) форме

fun zipWith f = fn xs =>
                  fn ys => 
                    case (xs,ys) of
                      ([],_) => []
                    | (_,[]) => []
                    | (x::xs',y::ys') => (f(x,y)) :: ((zipWith f) xs') ys'

Пример "curriedness":

- val add = zipWith (op +);
val add = fn : int list -> int list -> int list
- val add_123 = add [1,2,3];
val add_123 = fn : int list -> int list
- add_123 [4,5,6];
val it = [5,7,9] : int list
0 голосов
/ 22 октября 2018

fun f arg1 ... argN = exp является синтаксическим сочетанием клавиш для val rec f = fn arg1 => ... => fn argN => exp.Итак, в вашем случае у нас есть:

val rec zipWith = fn f => fn xs => fn ys =>
    case (xs, ys) of
    ...

Итак, zipWith - это функция, которая при задании аргумента f возвращает другую функцию, которая при задании аргумента xs, ... искоро.Другими словами, это карри.

...