2016-04-09 11 views
0

en düşünelim:Temel int işlemlerini zincirlemek için >> = nasıl kullanılır?

f :: Int 
f = return 64 >>= (\x -> x^2) >>= (\y -> y^2) 

GHCi (dördüncü güç sonucu yükselterek izledi karesi 64) 281,474,976,710,656 en azından ilgili

Couldn't match expected type `Int' with actual type `m0 b0' 
    In the expression: return 64 >>= (\ x -> x^2) >>= (\ y -> y^2) 
    In an equation for `f': 
     f = return 64 >>= (\ x -> x^2) >>= (\ y -> y^2) 
Failed, modules loaded: none. 

sonucu olmalıdır ya benim kod reddeder. Bu sorunu çözemiyorum. Ve benim yanlış anlaşılma monad'ım ile bağlantılı. Lütfen yardım et.

+1

Neden ki? Düz int işlemleri monadik değildir. (Eğer kimlik monadını saymazsanız) –

+0

'(\ x -> x^2) >> = (\ y _ -> y^4) $ 64' derlediğini ve' 281474976710656' olduğunu unutmayın: Monad nedir? – Michael

+0

@Michael Monad '((->) Int)': 'Int' argümanını alan ve' a 'türünü döndüren işlevlerdir. – amalloy

cevap

4

Bakmaya ihtiyacımız var (>> =). Ingilizce: ikinci bir argümanı (>> =), monadik bir değer üreten işlev olmalıdır. İşlevleriniz sadece sayı üretir.

Bu karışıklık, f'un Int olacağını bildirdiğinizden kaynaklanmaktadır. Oysa derleyici (>> =) bir m b Böylece hata mesajı döndürür bilir: En ek açıklama bu Int bulmak bekleniyor çünkü, ancak tüm bu f için kod için doğru olabileceğini m0 b0

Not oldu got (^) ve monad'ın mantıklı bir uygulamasına sahip bir sayı olan bir tür. Ancak Int böyle bir tür değil.

f = return 64 >>= pure . (^2) >>= pure . (^4) 

veya

f = (\x -> (x^2)^4) <$> return 64 

Ama bu yine de düz bir Int ama bazı monad bir Int olmayacak:

İstediğiniz şey muhtemelen! Böylece:

f :: Monad m => m Int 

(Bunu aslında derlemek yapmak monomorfizm kısıtlama kapatmak gerekecek düşünüyorum.)

+0

Çok teşekkürler. '<$>' – Gilgamesz

+0

@Gilgamesz '' fmap' ile aynı şeyi yapan infix operatörü nedir? – Ingo

İlgili konular