için Uygulayıcı örneği yazarken <*> nasıl yazılır Haskell Book, "Bölüm 22. Okuyucu" 'da bir alıştırma ile sıkışıp kaldım. Egzersiz "Reader için uygulamalı uygulamak" diyor ve aşağıdaki verir:Okuyucu r
{-# LANGUAGE InstanceSigs #-}
newtype Reader r a =
Reader { runReader :: r -> a }
instance Applicative (Reader r) where
pure :: a -> Reader r a
pure a = Reader $ ???
(<*>) :: Reader r (a -> b) -> Reader r a -> Reader r b
(Reader rab) <*> (Reader ra) = Reader $ \r -> ???
aksi GHC Hayır" şikayetçi oldu çünkü (I Functor
örneği yazdım ben de bir Functor
örneğini yazdıktan sonra pure
yazabiliyordu)" ‘Applicative (Reader r)’
için örnek bildirisinde bir örnek beyanının süper sınıf kaynaklanan (Functor (Reader r)) …
için örnek:
{-# LANGUAGE InstanceSigs #-}
newtype Reader r a =
Reader { runReader :: r -> a }
instance Functor (Reader r) where
fmap f (Reader x) = Reader (f . x)
instance Applicative (Reader r) where
pure :: a -> Reader r a
pure a = Reader $ \_ -> a
(<*>) :: Reader r (a -> b) -> Reader r a -> Reader r b
(Reader rab) <*> (Reader ra) = Reader $ \r -> ???
Ama ???
kısmı ile sıkıştım. Biz yapmanız gerekenleri açıklayan edeceğiz uygulamak fonksiyonunun tanım sizin için başlatılan got
ve kod yazmak:
kitap şu ipucu verir. Yukarıdaki Okuyucu’nın türünün paketini açarsanız, aşağıdakileri alırsınız.
<*> :: (r -> a -> b) -> (r -> a) -> (r -> b) -- contrast this with the type of fmap fmap :: (a -> b) -> (r -> a) -> (r -> b)
Peki, fark nedir? Fark,
fmap
'un aksineapply
'unr
türünde bir argümanını almasıdır.Bunu yapın.
Evet, ancak nasıl yapmalı? yazılan delikleri kullanarak derleyici, ???
türünün b
olması gerektiğini bildirir. Ama hala bir r
alır ve rab
ve ra
verilen b
türünde bir şey döndüren bir lambda ifade inşa edebilirsiniz göremiyorum. Eğer kapsamında olan parçalara baktığımızda
Ayrıca, bu kitabı satın alamayacak olanlar için 'Reader' veri türünün tanımını da sağlayabilir misiniz? –
@Rhymoid Bu biraz sert. Ne 'Reader', genel bilgidir, ne de olsa. – duplode
Eksik Reader türü için özür dilerim, yukarıdaki soruya ekledim. –