Каррирование функции для получения другой функции: unit -> 'a - PullRequest
2 голосов
/ 17 февраля 2011

Учитывая функцию высшего порядка, такую ​​как:

let call (f : unit -> 'a) = f()

И еще одна функция:

let incr i = i + 1

Есть ли способ передать incr в call, безиспользуя лямбду: (fun () -> incr 1)?

Очевидно, что передача (incr 1) не работает, так как функция тогда «полностью применяется».

Чтобы уточнить: мне интересно, есть ли способ карри функции, чтобы она стала функцией: unit -> 'a.

Ответы [ 2 ]

2 голосов
/ 17 февраля 2011

Вы можете определить такой ярлык самостоятельно:

let ap f x = fun () -> f x

call (ap incr 1)

Если функция, которую вы хотите преобразовать, оказывается чистой функцией, вы можете вместо нее определить постоянную функцию:

let ct x _ = x  (* const is reserved for future use :( *)

call (ct (incr 1))
1 голос
/ 18 февраля 2011

Это больше похоже на попытку добавить лень к строгому F #, чем к карри.И на самом деле для этого есть встроенное средство в F #: http://msdn.microsoft.com/en-us/library/dd233247.aspx - lazy ключевое слово плюс неловкое Force:

Не уверен, что это лучше, чем явная лямбда, но все же

let incr i = 
    printf "incr is called with %i\n" i
    i+1

let call (f : unit -> 'a) =
    printf "call is called\n"
    f()

let r = call <| (lazy incr 5).Force

printf "%A\n" r
...