2016-10-28 57 views
-5

理解這Traversable的執行以下example from the NICTA course我怎麼能理解我無法列出

instance Traversable List where 
    traverse :: 
     Applicative f => 
     (a -> f b) 
     -> List a 
     -> f (List b) 
    traverse f = 
     foldRight (\a b -> (:.) <$> f a <*> b) (pure Nil) 

在下文中,我將與[]取代List,所以我們有:

instance Traversable [] where 
    traverse :: 
     Applicative f => 
     (a -> f b) 
     -> [a] 
     -> f ([b]) 
    traverse f = 
     foldRight (\a b -> (:) <$> f a <*> b) [] 

特別是,(<*>)的類型的以下推導出了什麼問題?

(:) :: a -> [a] -> [a] 
(<$>) :: a -> b -> F a -> F b, F for Functor 

(因此...)

(:) <$> :: F a -> F ([a] -> [a]) 
f  :: a -> A b :: ((->) a) (A b), A for Applicative 

(因此...)

(:) <$> f :: ((->) a) ([a] -> [a]) 
(:) <$> f a :: [a] -> [a] 
(<*>) :: A (a -> b) -> A a -> A b 
+2

你能否更精確什麼你不明白嗎?已經有摺疊,「Functor」和「Applicative」了嗎?很難知道需要寫多少才能以目前的形式回答你的問題。 – duplode

+0

是的,我知道一點關於Functor和Applicative。如何可以(:) <$> f a <*> b :: f [b]? (:) :: a - > [a] - > [a],(<$>):: a-> b-> f a-> fb,應該(:) <$>爲f(a - > [a]) - > f [a]? – beHappy

+0

你應該編輯你的問題,添加你剛剛對它說的話。那樣的話,由於不清楚或者過於寬泛,它最終會被忽略或關閉。 – duplode

回答

0

有什麼不對下面的推導?

的問題是這樣一段話:

(:) <$> f :: ((->) a) ([a] -> [a]) 

功能的應用始終優先於任何運營商,所以(:) <$> f a((:) <$> f) a,在你的推導,但(:) <$> (f a)。其餘沿着平滑(你可能想嘗試閱讀下面的解決方案之前完成它自己):

(:) <$>  :: F a -> F ([a] -> [a]) -- The third line of your derivation. 
f   :: a -> A b 
f a   :: A b 
(:) <$> f a :: A ([b] -> [b]) 
(<*>)    :: A (a -> b) -> A a -> A b 
(:) <$> f a  :: A ([b] -> [b]) 
(:) <$> f a <*> :: A [b] -> A [b] 
b     :: A [b] 
(:) <$> f a <*> b :: A [b] 
+1

明白了,我在這裏住了幾天,謝謝你的幫助! – beHappy