Карри функции F # - PullRequest
       48

Карри функции F #

1 голос
/ 22 февраля 2012

У меня вопрос по поводу двух типов int -> (int -> int) и (int -> int) -> int. В чем разница между этими двумя?

Я где-то читал здесь, что первая может быть интерпретирована как функция, которая принимает int и возвращает функцию, которая принимает и int и возвращает int, что совпадает с int -> int -> int. Это правильно?

Ответы [ 4 ]

3 голосов
/ 22 февраля 2012

Разница между int -> (int -> int) и int -> int -> int незначительна (вам действительно будет важно, если вам придется взаимодействовать с другим языком).Это карри функции, которые эффективно принимают два целых числа и возвращают целое число (например, встроенный оператор сложения имеет тип вдоль этих линий).

Однако оба они очень отличаются от (int -> int) -> int,которая принимает функцию из целых чисел в целые и возвращает целое число.Как уже упоминалось, единственный простой пример такой функции - применить данную функцию к определенному значению (например, fun (f:int->int) -> f 13).

3 голосов
/ 22 февраля 2012

Хороший вопрос, я подозреваю, что функционально нет большой разницы. Я потратил некоторое время, пытаясь понять, как получить эти две подписи. (let fun1 i = fun j -> i + j Джона Палмера просто дает int -> int -> int для меня)

let add a b = a + b       // int -> int -> int
let inc a = add a         // int -> (int -> int)

Я не мог придумать необдуманный пример для второй подписи:

let foo fn : int -> fn 1  // (int -> int) -> int

(Это не дает прямого ответа на ваш вопрос, но может дать кому-то что-то, что можно пережевывать)

2 голосов
/ 22 февраля 2012

Я действительно не знаю F #, но это кажется довольно интуитивным (многие другие языки имеют те же понятия).

  1. Является ли функция, принимающая int, и возвращающая функцию, которая принимает int и возвращает int
  2. Является ли функция, принимающая функцию, которая принимает int и возвращает int, и возвращает int

Первый тип будет похож на карри.

0 голосов
/ 22 февраля 2012

Итак, давайте посмотрим, как будут выглядеть реализации:

first

let func1 i = fun j -> i+j

с подписью int -> (int -> int)

обратите внимание, что func1 2 3 не должноработа

РЕДАКТИРОВАТЬ: Оказывается, из-за того, как работает ассоциативность, это на самом деле хорошо

, но это отличается от

let func2 i j= i+j

, которыйимеет тип int -> int -> int

здесь func2 1 2 отлично

другой пример, который мы можем создать так:

let func4 a = a 1

это будет иметь подпись ('t->int) -> u сбор бетона a будет работать.Обратите внимание, что func4 1 2 точно не скомпилирует

...