2016-10-28 54 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