F # Seq.fold intellisense - PullRequest
       17

F # Seq.fold intellisense

2 голосов
/ 23 апреля 2011

Я изучаю F # и пытаюсь разобрать значение intellisense, которое появляется для Seq.fold:

val fold : ('State -> 'T -> 'State) -> 'State -> seq<'T> -> 'State

В C # я привык к методу расширения Aggregate и прекрасно понимаю объявление C #:

(extension) TAccumulate Aggregate<TSource, TAccumulate>(this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func);

Итак, чтобы понять / вывести синтаксис F # в этом случае, я пытался установить аналогию между Seq.fold и Aggregate, но, возможно, это неправильный подход. Я понимаю, что -> определяет функцию (или сигнатуру?), Но помимо этого мне трудно читать то, что появилось.

Чтобы было ясно, мне не нужен пример того, как использовать складывание; Я просто ищу разбивку синтаксиса F #, используемого в Seq.fold intellisense. Спасибо.

Ответы [ 2 ]

5 голосов
/ 23 апреля 2011

В F # и многих других функциональных языках 'a -> 'b -> 'c -> 'd - это тип функции, который принимает параметры типа 'a, 'b, 'c в качестве входных данных * и возвращает 'd. Итак

  ('State -> 'T -> 'State)
//  1st      2nd   output

в C # означает функцию типа

State func<State,T>(State firstInput, T secondInput);

и

  ('State -> 'T -> 'State) -> 'State -> seq<'T> -> 'State
//1st input (a function)      2nd       3rd        output

в C # означает функцию типа

State func<State,T>(Func<State, T, State> firstInput,
                    State secondInput, 
                    IEnumerable<T> thirdInput);

*: карри пока игнорируется.

1 голос
/ 23 апреля 2011

fold - это функция, которая принимает функцию (fun), которая принимает элемент типа «State» и элемент типа T и возвращает значение типа «State» (('State -> 'T -> 'State)), значение типа «State» и последовательность элементов. типа T и возвращает значение типа `State

В основном введите следующее в интерактивном режиме F #

let sum x y = x+y;;

и вы увидите

val sum : int -> int -> int

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

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

Таким образом, вышеприведенное на самом деле представляет собой int -> (int -> int) функцию, принимающую int и возвращающую функцию, которая принимает int и возвращает int (называемый каррированием).

...