2009-11-11 12 views
10

Typem Prelude funkcji flip jest:Czy jest możliwe użycie funkcji jednoargumentowej zamiast binarnej w `flip`?

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

To znaczy, trwa jedną funkcję binarną i dwa argumenty.

Typem Prelude funkcji id jest:

id :: a -> a 

ale rodzaj flip id jest:

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

Jak to możliwe, aby zastosować flip do id gdy id jest jednoskładnikowa funkcja i flip wymaga funkcji binarnej dla pierwszego argumentu?

btw. flip id jest podobna do \ x f -> f x

Odpowiedz

15

Haskell sprawia id dopasować typ pierwszy argument do flip ustawiając a = b -> c. Więc:

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

gdzie id jest uważany typu

id :: (b -> c) -> b -> c 

co odpowiada

id :: (b -> c) -> (b -> c) 

tj specjalizacji id że stosuje się wyłącznie do funkcji jednoargumentowych.

Edycja: Myślę, że mogę przeformułować swoją pierwszą linię jako:
Haskell dedukuje że id pasuje typ pierwszy argument do flipjeżelia = b -> c.
W przypadku, gdy jest to bardziej wyraźne.

+0

Zapomniałam, że ogólny identyfikator typu 'A' może być zbyt funkcja, dzięki. –

4

Nefrubyr wyjaśnia to bardzo dobrze.
Innym sposobem (na szczęście) uczynienia tego nieco bardziej intuicyjnego jest myślenie o użytkowniku aplikacji ($).

($) jest wyspecjalizowaną formą id:

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

Widziałem definicję (#) = flip ($) tak, że można pisać argument przed funkcją jego zastosowanie do: obj # show.

Oczywiście, ponieważ ($) tylko wyspecjalizowaną formą id, można również napisać: (#) = flip id

Powiązane problemy