Подтвердить что ты не робот

Почему у Haskell "flip id" есть этот тип?

Мне интересно выражение flip id (Это не домашнее задание: я нашел его в документации getOpt).

Интересно, почему он имеет этот тип:

Prelude> :t (flip id)
(flip id) :: b -> (b -> c) -> c

Например, (flip id) 5 (+6) дает 11.

Я знаю, почему id (+6) 5 дает 11, но я не "получаю" flip id вещь.

Я попытался понять это сам, используя ручку и бумагу, но не мог. Может ли кто-нибудь объяснить это мне? Я имею в виду, как flip id появился тип b -> (b -> c) -> c?

4b9b3361

Ответ 1

Функция id имеет этот тип:

id :: a -> a

Вы получаете экземпляр этого типа при замене a на a -> b:

id :: (a -> b) -> (a -> b)

который из-за currying совпадает с:

id :: (a -> b) -> a -> b

Теперь примените flip к этому, и вы получите:

flip id :: a -> (a -> b) -> b

В случае id (+) экземпляр:

id :: (Num a) => (a -> a) -> (a -> a)

Теперь flip id дает вам:

flip id :: (Num a) => a -> (a -> a) -> a

Примечание: это также показывает, как ($) совпадает с id, только с более ограниченным типом:

($) :: (a -> b) -> a -> b
($) f x = f x
-- unpoint:
($) f   = f
-- hence:
($)     = id