fun-girlz


Operacja na funkcjach

Skoro funkcje są wartościami, to nic nie stoi nam na przeszkodzie żeby używać ich z operatorami. Podstawową operacją na funkcjach jest ich złożenie:

1: 
2: 
3: 
4: 
let (<<) f g = fun x -> f (g x)

let add2mul5 = (*) 5 << (+) 2
let add2mul5' x = (x + 2) * 5

Wiadomo, które jest bardziej czytelne, ale w przypadku niektórych złożonych wyrażeń, pozbywamy się sporej ilości nawiasów stosując operator złożenia.

Kolejnym operatorem jest to z czego znany jest F#, czyli |> (pipe), który służy do pompowania wyników jednej funkcji do drugiej.

1: 
2: 
3: 
let (|>) x g = g x

let add2mul5'' x = x + 2 |> (*) 5

Widzicie różnicę? Pipe bierze wartość, a nie funkcję, więc będzie miał nieco inne zastosowania. Zazwyczaj składamy funkcje zanim mamy wartość do przesłania przez nie, a używamy pipe'a kiedy tą wartość od razu mamy.

1: 
(f << g) x  <=>  f <| g x

Przełożenie funkcji krotki na funkcje argumentowe, jest rzadszym ale również spotykanym przypadkiem operacji na funkcjach. Polega ono na rozwijaniu parametrów z krotki.

1: 
2: 
let uncurry f = fun x -> fun y -> f (x,y)
let curry f = fun (x,y) -> f x y

Nie mam dobrego pomysłu na zadanie, które nie będzie trywialne, więc przejdźmy do następnego modułu

val f : ('a -> 'b)
val g : ('c -> 'a)
val x : 'c
val add2mul5 : (int -> int)

Full name: Funops.add2mul5
val add2mul5' : x:int -> int

Full name: Funops.add2mul5'
val x : int
val x : 'a
val g : ('a -> 'b)
val add2mul5'' : x:int -> int

Full name: Funops.add2mul5''
val uncurry : f:('a * 'b -> 'c) -> x:'a -> y:'b -> 'c

Full name: Funops.uncurry
val f : ('a * 'b -> 'c)
val y : 'b
val curry : f:('a -> 'b -> 'c) -> x:'a * y:'b -> 'c

Full name: Funops.curry
val f : ('a -> 'b -> 'c)
F# Project