2012-01-06 19 views
15

Sanırım uygulamalı funktörlerin Haskell'de nasıl çalıştığını ve onları temel veri türleri için kullanıyorum (Belki, Ya ...).Paylaşılan parametreleri iletmek için hangi uygulama functor kullanılır?

withPool pool = bracket (takeConn pool) (putConn pool) 

uygulamalı bir tarzda tekrar yazılabilir: Ancak, aşağıdaki örnekle this question bulundu

withPool = bracket <$> takeConn <*> putConn 

Ben derlenmiş şaşırdı ve gerçekten de beklenen işleri gibi ama biri olan Uygulamalı bana söyler misiniz Bunun için Functor kullanılır ve nasıl tanımlanır?

Güncelleme: Sanırım nasıl çalıştığını anladım ama nerede tanımlandığı konusunda hiçbir fikrim yok.

cevap

17

Birleştirmek f = tipi imzaları içinde (a ->): bildirimler sözdizimsel farklıdır

fmap :: (b -> c) -> (a -> b) -> (a -> c) 
pure :: b -> (a -> b) 
(<*>) :: (a -> b -> c) -> (a -> b) -> (a -> c) 

tek nedeni, (a ->) vs ((->) a), sen tür düzeyinde bölümleri çekmek için izin verilmez olmasıdır.

instance Functor ((->) a) where 
    fmap = (.) 

instance Applicative ((->) a) where 
    pure = const 
    f <*> g = \x -> f x $ g x 

Ben Functor örneği Data.Functor olduğunu eminim ve Applicative örneği Control.Applicative içindedir: Yani kovalayan türleri sonra bu ile bitirmek. ((->) a) için Monad örneği Control.Monad yerine, Control.Monad.Instances'da garip bir noktadaki tek örnektir. En azından doğru bir şekilde hatırlarsam.

+9

Değeri için, bu aslında okuyucu monad, eksi “newtype” sarmalayıcıdır - burada “paylaşılan parametre”, “Reader” için “çevre” ile aynıdır. Benzer bir şekilde, 'Hata Hata 'ya da' (') w' yazardır. –

+0

@ C.A.McCann Dikkat çekmeye değer, ve unuttum. Bunu eklediğiniz için teşekkürler. – Carl

İlgili konular