Haskell Hero

Interaktivní učebnice pro začínající Haskellisty

curry, uncurry

Úvodem

Víme, že existují binární funkce. Například (+), (-) nebo const. Pak také existují unární funkce, které si jako argument berou dvojici. Například fst nebo snd.

Vidíme, že funkce const a fst mají podobné chování. const x y se vyhodnotí na svůj první argument x, fst (x,y) se vyhodnotí na první složku svého argumentu, čili na x.

Jelikož jsou obě funkce jednoduše definovatelné, nedělá nám problém je definovat nezávisle na sobě. Někdy je ale výhodnější použít právě funkci curry nebo uncurry.

curry

curry je ternární funkce. Jejími argumenty jsou:

  • unární funkce f, která si bere jako argument dvojici, typ (a,b) -> c
  • x typu a, které se dá použít jako první složka argumentu funkce f
  • y typu b, které se dá použít jako druhá složka argumentu funkce f

Funkce curry se při vyhodnocování výrazu curry f x y zachová tak, že argumenty x a y zabalí do dvojice (x,y) a na tuto dvojici aplikuje funkci f. Výsledek je typu c.

Definice

curry       ::  ((a,b) -> c) -> a -> b -> c
curry f x y  =  f (x,y)

Příklady

curry fst  5  True   ~>  fst (5,True)     ~>  5
curry snd 'y' "bbb"  ~>  snd ('y',"bbb")  ~>  "bbb"

uncurry

Funkce uncurry má opačný účel jako funkce curry. Je to binární funkce, jejímiž argumenty jsou:

  • binární funkce f typu a -> b -> c
  • dvojice (x,y) typu (a,b), kde první složka se dá použít jako první argument funkce f a druhá složka se dá použít jako druhý argument funkce f.

Funkce uncurry při vyhodnocování výrazu uncurry f (x,y) rozbalí dvojici (x,y) a aplikuje funkci f na argumenty x a y.

Definice

uncurry         ::  (a -> b -> c) -> (a,b) -> c
uncurry f (x,y)  =  f x y

Příklady

uncurry const (False,8)  ~>  const False 8  ~>  False

uncurry (flip const) ("ccc",'a')
  ~>  flip const "ccc" 'a'
  ~>  const 'a' "ccc"
  ~>  'a'