2012-05-30 28 views
7

foldM işleminde, x bir değer ve f :: a -> b değeri olan bir lambda \x f -> f x var.Haskell işlev çağrısı işlevini tersine çevirmek için işlev

yapar yerleşik bir işlevi var mı? Bu |> muhtemelen benzer

Ben flip bunu yapacağını sanan bazı f'

foldM f' ... 

ile

foldM (\x f -> f x) ... 

değiştirebilir miyim, ancak üç argüman (flip :: (a -> b -> c) -> b -> a -> c)

alır F # içinde.

cevap

20

flip id veya flip ($)'u kullanabilirsiniz (($) yalnızca özel bir id işlevleri için):

Prelude> flip id 3 (+2) 
5 
Prelude> flip ($) 7 (>10) 
False 

Bu kısmi uygulamanın ilginç bir kullanımı olup: bir fonksiyon olarak hemen f x olan id f xf ile. Açıkçası, bu nedenle flip id Aradığınız fonksiyonudur, da(flip id) x f aynıdır.

Maceralı hissediyorsanız, flip id veya flip ($) türlerini el ile inferring deneyin. `Bir ile bir şey bekliyordum flip` var` üzerine> a` imza nasılsa eşleştirebilirsiniz - Eğlenceli :) kağıt ve kalem ile bana 5 dakika sürdü

+0

Vay, id' en 'bir nasıl' çalışmak var - > b -> c '. Bu biraz içine girmeye değer olabilir! – Ashe

+1

@Len: İşlevlere uygulandığında, "id" nin ($) " –

+0

ile aynı olduğunu gördüğünüzde bu daha net olur! Bu çok doğrudur! Benim için "a-ha" anı, 'a -> (b -> c)' olarak a -> b -> c 'yi görmem gerektiğini ve sonra bunu' id 'ile eşleştirdiğimi fark ediyordu. s 'a' -> a '' ve 'a = a' = (b -> c) 'yi bulduğumu fark ettim - aritmedeki farklılıklara çok fazla bakıyordum ve geçemedim. – Ashe

8

Evet, örneğin flip :: (a -> b -> c) -> b -> a -> c denir flip (>) 3 5 == True. Hacker'da daha fazla bilgi ve kaynak: flip. Ne istiyorsun

doğru, fonksiyon uygulamanın argümanları ters basitçe? Eh, ($) fonksiyon uygulaması olduğundan, çevirme kullanarak flip ($) :: b -> (b -> c) -> c yazabilirsiniz. Ne olduğunu görelim. İşte iki prelude fonksiyonları için kaynağıdır: Birlikte türlerini koymak Yani eğer

-- from Hackage: 
($)      :: (a -> b) -> a -> b 
f $ x     = f x 

-- from Hackage: 
flip     :: (a -> b -> c) -> b -> a -> c 
flip f x y    = f y x 

, temelde, flip ($)

flip ($) :: 
    b  -> -- type of x, argument of y and second argument of ($) 
    (b -> c) -> -- type of y, function applied by ($) as its first argument 
    c  -> -- result of the application "y x" 

olur sen fonksiyonların gerçek tanımları izleyin:

flip ($) = (\f x y -> f y x) ($) -- from flip's def. 
     = \x y -> ($) y x   -- partial application 
     = y x      -- from ($)'s def. 
İlgili konular