Tacit or point-free style programming позволяет создавать функции независимо от их аргументов. Можно ли это сделать в F #?Можно ли писать неактивные функции в F #
ответ
Просто пойти с ответом & комментарием Чака Криса Smiths', вы могли бы написать
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 и его неявном операторе fork. Это очень мощно. Вы можете создавать эквивалентные операторы более высокого порядка в F #, но они не будут применяться неявно. Так, например, сначала необходимо определить lift
(с использованием явных аргументов)
let lift op a b x = op (a x) (b x)
, а затем применить его в явном виде
let avg = lift (/) List.sum List.length
, чтобы получить что-то похожее the J example на странице Википедии вы связаны. Но это не совсем «молчаливо».
Несомненно. Все, что вам нужно - это композиция функций и каррирование, и оба они возможны в F #.
let compose f1 f2 = fun x -> f1 (f2 x);;
let digits = compose String.length string_of_int;;
digits 9000;; // 4
Я бы написал написанный наоборот, таким образом он будет выглядеть как оператор >>. – Benjol
У F # есть следующие операторы для такого рода >>, <<, |>, <|, ||>. –
Привет, Габриэль. Могу я задать вопрос? Является ли отсутствие оператора «неявного fork» в FSharp заставлять меня писать только однонаправленные молчаливые функции (аргументы пакета в кортеже/список и т. Д.); но никогда не позволяет мне писать две/три/четыре /..- аргумента молчаливые функции? – Bubba88