Понимание функции флип - PullRequest
1 голос
/ 04 июня 2019

Я изучаю функции высшего порядка из «Learn You a Haskell for Great Good!»Миран Липовака.

Для следующей функции flip, которая принимает функцию и возвращает функцию с переброшенными первыми двумя аргументами:

flip' :: (a -> b -> c) -> (b -> a -> c)
flip' f = g
   where g x y = f y x

Я не совсем понимаю, что такое f и g,Это две разные функции?Аналогично, в привязке where, что именно означает g x y = f y x?

Ответы [ 2 ]

5 голосов
/ 04 июня 2019

f - это вход flip' (функция, которую вы хотите перевернуть), g - это выход flip' s (перевернутая функция, которую он вернет).

Предложение where просто определяет, что такое g; то есть определение функции, которая просто вызывает f с обратными аргументами.

Вы можете вообще избежать именования g, просто flip' вернув лямбду:

flip' :: (a -> b -> c) -> (b -> a -> c)
flip' f = \x y -> f y x
5 голосов
/ 04 июня 2019

В синтаксисе:

myFunction x = x + 2

вещи в левой части знака равенства, x, рассматриваются как «параметры».Вы можете использовать их справа от знака равенства, чтобы указать, каким должен быть результат.

Этот синтаксис определяет функцию myFunction с одним параметром x.

* 1010.* Итак, у нас есть:
flip' f = g

Это определяет функцию flip' с одним параметром f.

У нас также есть другое определение:

g x y = f y x

Это определяет функцию g, с двумя параметрами, x и y.

Так что, когда мы говорим:

flip' f = g
  where
    g x y = f y x

Мы говорим, что результатflip f - это функция g, где g определяется как g x y = f y x.

В случае, если короткие имена переменных сбивают вас с толку, здесь та же функция с некоторыми именами, замененными для ясности:

flippity flop = glop
  where
    glop x y = flop y x

Посмотрите, сможете ли вы понять, что делает flippity, и посмотрите, сможете ли вы увидеть, как оно совпадает с flip', только с другими именами внутренних параметров и вспомогательных функций.

Помните также в Haskell, что мы всегда можем заменить вызовы функций их телом, для большинстваИзобразительное искусство.Таким образом, мы можем переписать это как:

flippity flop = glop
  where
    glop = \x y -> flop y x

-- replace glop with its definition

flippity flop = \x y -> flop y x

Итак, мы можем видеть, что flippity - это функция, которая принимает функцию flop и возвращает новую функцию, \x y -> flop y x.

...