Можно ли написать неявные функции в F # - PullRequest
4 голосов
/ 27 ноября 2009

Молчаливое или бессмысленное программирование в стиле позволяет создавать функции без учета их аргументов. Можно ли это сделать в F #?

Ответы [ 2 ]

6 голосов
/ 27 ноября 2009

Просто чтобы ответить на вопрос Чака и комментария Криса Смита, вы можете написать

let digits = string_of_int >> String.length
digits 9000;; // 4
[1; 10; 100] |> List.map digits;; // [1;2;3]

Когда вы объединяете эти операторы композиции и конвейера с функциями более высокого порядка, вы можете очень кратко делать сложные вещи:

let prodSqrtAbs = Seq.map (abs>>sqrt) >> Seq.reduce (*)
prodSqrtAbs [| -9.0; 4.0 |];;  // 6.0

EDIT : Я только что прочитал о J и его неявном операторе разветвления. Это очень сильно. Вы можете создавать эквивалентные операторы высшего порядка в F #, но они не будут применяться неявно. Так, например, сначала определите lift (используя явные аргументы)

let lift op a b x = op (a x) (b x)

и затем применить его явно

let avg = lift (/) List.sum List.length

чтобы получить что-то похожее на пример J на странице Википедии, на которую вы ссылались. Но это не совсем "молчаливый".

3 голосов
/ 27 ноября 2009

Конечно. Все, что вам нужно, это составление функций и каррирование, и то и другое возможно в F #.

let compose f1 f2 = fun x -> f1 (f2 x);;
let digits = compose String.length string_of_int;;
digits 9000;; // 4
...