È possibile scrivere funzioni tacite in F #
-
05-07-2019 - |
Domanda
Programmazione tacita o senza punti consente di creare funzioni senza tener conto dei loro argomenti . Questo può essere fatto in F #?
Soluzione
Giusto per andare con la risposta di Chuck & amp; Commento di Chris Smiths, potresti scrivere
let digits = string_of_int >> String.length
digits 9000;; // 4
[1; 10; 100] |> List.map digits;; // [1;2;3]
Quando combini quelle composizione e amp; operatori di pipeline con funzioni di ordine superiore, puoi fare cose complicate in modo molto succinto:
let prodSqrtAbs = Seq.map (abs>>sqrt) >> Seq.reduce (*)
prodSqrtAbs [| -9.0; 4.0 |];; // 6.0
EDIT : ho appena letto di J e del suo operatore fork implicito. È molto potente. Puoi creare operatori equivalenti di ordine superiore in F #, ma non verranno applicati implicitamente. Quindi, ad esempio, prima definire lift
(usando argomenti espliciti)
let lift op a b x = op (a x) (b x)
e quindi applicarlo esplicitamente
let avg = lift (/) List.sum List.length
per ottenere qualcosa di simile a l'esempio J sulla pagina Wikipedia a cui ti sei collegato. Ma non è del tutto "tacito."
Altri suggerimenti
Certo. Tutto ciò che serve è la composizione delle funzioni e il curry, ed entrambi sono possibili in F #.
let compose f1 f2 = fun x -> f1 (f2 x);;
let digits = compose String.length string_of_int;;
digits 9000;; // 4