2009-11-11 15 views
10

Prelude fonksiyonunun flip türüdür:`Flip`de ikili yerine tekil işlev kullanmak mümkün mü?

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

yanı, o bir ikili fonksiyonu ve iki argüman alır.

Prelude fonksiyonunun id türüdür:

id :: a -> a 

Ama flip id türüdür: id bir tek terimli fonksiyon olduğunda mümkün id için flip uygulamaktır nasıl

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

ve flip ilk arg için ikili işlev gerektirir?

btw. \ x f -> f x

cevap

15

Haskell ida = b -> c ayarlayarak flip ilk argüman türüne uygun hale getirir için flip id benzer. Böylece: id

yani sadece tekli fonksiyonlar için de geçerlidir id bir uzmanlık
id :: (b -> c) -> (b -> c) 

eşdeğerdir tip

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

olması alınır

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

.

Düzenleme:
Haskell idflipeğera = b -> c ilk argüman türüne uyan deduces: Ben benim ilk satırı ifadeleri düşünüyorum.
Daha açık olması durumunda.

+0

ben teşekkür genel tip tanımlayıcı 'a' de bir fonksiyon olabilir unuttum. –

4

Nefrubyr bunu çok iyi açıklıyor.
Bunu biraz daha sezgisel hale getirmenin başka bir yolu, işlev uygulama operatörü ($)'u düşünmektir. obj # show: Sana onun uygulanan işlevi önce argüman yazabilirsiniz şekilde tanımını (#) = flip ($), gördüğüm

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

:

($)id özel bir şeklidir. ($)id sadece özel bir şeklidir çünkü Açıkçası

, ayrıca yazabilirsiniz: (#) = flip id

İlgili konular