2009-11-27 5 views

ответ

6

Просто пойти с ответом & комментарием Чака Криса 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 на странице Википедии вы связаны. Но это не совсем «молчаливо».

+0

Привет, Габриэль. Могу я задать вопрос? Является ли отсутствие оператора «неявного fork» в FSharp заставлять меня писать только однонаправленные молчаливые функции (аргументы пакета в кортеже/список и т. Д.); но никогда не позволяет мне писать две/три/четыре /..- аргумента молчаливые функции? – Bubba88

3

Несомненно. Все, что вам нужно - это композиция функций и каррирование, и оба они возможны в F #.

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

Я бы написал написанный наоборот, таким образом он будет выглядеть как оператор >>. – Benjol

+0

У F # есть следующие операторы для такого рода >>, <<, |>, <|, ||>. –

 Смежные вопросы

  • Нет связанных вопросов^_^