2013-09-01 18 views
15

Haskell'de, ((->) t) örneklerin tip imzasında ne anlama geliyor? örnek funktoru, uygulamalı ve Monad için tüm çizgisinde bir örneği var: Bu tip imza ne anlama geldiğini herhangi bir açıklama bulamıyorumHaskell'de ne ((->) t) ne anlama geliyor?

Functor ((->) r) 

ve son derece arama motoru dayanıklı bu.

+3

'yüksek arama motoru resistant' - değil SO arama motoru için. Bkz. Http://stackoverflow.com/q/5310203/11683 – GSerg

+1

Haklısınız! Sanırım bazen doğrudan Google’a güvenmek yerine doğrudan SO’yı aramayı düşünmeliyim. – drt

+0

Ayrıca [SymbolHound] (http://www.symbolhound.com/?q=Functor+%28%28-%3E%29+r%29) adresinden de arama yapabilirsiniz. merak bu soruya karşısında olur –

cevap

19

->, infix tipi bir kurucudur. Liste türü için bir infix değeri yapıcısı olan : ile karşılaştırabilirsiniz. Bir önek işlevi uygulama olur, böylece : yalnız bunun parantez koymak kullanmak için:

(:) a ba : b

aynıdır Benzer şekilde, (->) a ba -> b, a den b için bir işlev türü ile aynıdır.

(->) a, tip kurucunun ve kendi türünde * -> * türünde bir tür yapıcının kısmi bir uygulamasıdır.

Bunu "bir işlev türünden bir kurucu" olarak düşünebilirsiniz. Örneğin. (->) IntInt gelen fonksiyonların türlerinin bir yapıcı olduğunu. Başka bir tür geçirerek tam işlev türü oluşturabilirsiniz: (->) Int String, Int - String arasındaki işlevlerin türüdür.

instance Functor (->) a, a -> b işlevini a -> c işlevine dönüştürerek fmap işlevini içeren bir işleçtir.ile, fmap argümanını Right değerlerine uygulayarak Either a b ile Either a c arasındaki haritaları karşılaştırabilirsiniz.

+0

Teşekkürler. Bu çoğunlukla bana mantıklı geliyor. Hala Haskell için biraz yeni, bu yüzden sindirmek için biraz zaman alacak. – drt

+7

'(->) r' örnekleri, benim düşünceme göre * çok * anlaşılması zor. Bir çok Haskell ile nispeten güvende hissediyorum, ama hala (->) r' örneklerinin nasıl çalıştığına dair hiçbir sezgim yok.Onları * kullanabilirim, çünkü onları her zaman kullanırım, bu yüzden artık benim için çok garip değil. Sadece onları derinden anladığımı söylemem. Sen de endişelenme. Eminim ikimize de zamanında gelecektir. – kqr

+0

@kqr Monad örneğinin ne yaptığını bildiğiniz zaman, bunu güzel bir şekilde türetebileceğinizi düşünüyorum. Yazdığım bu küçük not, çok ayrıntılı (ama biraz anlaması kolay) tanımıyla başlar. >> = ', ve doğru bir şekilde golflendirildiğinde, LYAH'dan bildiğiniz alışılmış uygulama ile aynıdır. Örneğin. https://github.com/quchen/articles/blob/master/reader_instance_derived.md#bind – David

4

r -> a türünde r'un sabitlendiği tür kümeleri olarak görebilirsiniz.

Bir functor m türünde bir işlevdir, yani a türünde m a türünüz var demektir. Örnekler Maybe, [] ve (->) r bulunmaktadır. İkincisi daha iyi (r ->) yazılmalıdır, ancak izin verilip verilmediğini bilmem gerekir.

10

Biz lambda fonksiyonları ve infix işlevlerini kullanabilirsiniz:

(->) a = \b -> (->) a b --pseudo-Haskell 
(->) a = \b -> a -> b --pseudo-Haskell 

böylece, hem örneğini okuyun:

class Functor f where 
    fmap :: (a->b) -> f a -> f b 

instance Functor ((->)r) where 
    fmap :: (a->b) -> f  a -> f  b 
     = (a->b) -> (->)r a -> (->)r b --pseudo-Haskell 
     = (a->b) -> (r -> a) -> (r -> b) --pseudo-Haskell 
+1

Bu aslında sezgilerim için oldukça yardımcı oldu. '(->) r''nin uygulayıcı örneği için de aynı şeyi yapmalıyım! – kqr