Haskell 如何理解列表的可遍历实现
我很难理解以下内容: 特别是,Haskell 如何理解列表的可遍历实现,haskell,traversable,Haskell,Traversable,我很难理解以下内容: 特别是,()类型的以下派生有什么问题 (:)::a->[a]->[a] ()::a->b->F a->F b,F代表函子 (因此……) (:)::fa->F([a]->[a]) f::a->AB:((->)a)(AB),a代表应用程序 (因此……) (:)f:((->)a)([a]->[a]) (:)f a::[a]->[a] ()::A(A->b)->A->A b 下面的推导有什么问题 这段话的问题在于: (:) <$> f :: ((->) a)
()
类型的以下派生有什么问题
(:)::a->[a]->[a]
()::a->b->F a->F b,F代表函子
(因此……)
(:)::fa->F([a]->[a])
f::a->AB:((->)a)(AB),a代表应用程序
(因此……)
(:)f:((->)a)([a]->[a])
(:)f a::[a]->[a]
()::A(A->b)->A->A b
下面的推导有什么问题
这段话的问题在于:
(:) <$> f :: ((->) a) ([a] -> [a])
(:)f:((->)a)([a]->[a])
函数应用程序始终优先于任何运算符,因此(:)fa
不像在派生中那样是(:)f)a
,而是(:)(fa)
。接下来的步骤很顺利(在阅读下面的解决方案之前,您可能希望自己尝试完成它):
(:)::fa->F([a]->[a])——派生的第三行。
f::a->a和b
a::a b
(:)f a::a([b]->[b])
()::A(A->b)->A->A
(:)f a::a([b]->[b])
(:)fa::a[b]->a[b]
b::A[b]
(:)fab::a[b]
请您更准确地说明您不理解的内容好吗?你已经可以折叠、函子和应用程序了吗?很难知道一个人需要写多少才能以当前的形式回答你的问题。是的,我对函子和应用程序略知一二。怎样才能(:)fab::f[b]?(:)::a->[a]->[a],()::a->b->f a->f b,应该(:)是f(a->[a])->f[a]?你应该编辑你的问题来添加你刚才说的内容。这样,它就不太可能因为不清楚或太宽泛而被忽视或关闭。请注意,如果你在最初的问题中清楚地解释了你想问什么,你得到的五张反对票是完全可以避免的。在以后的提问中,请记住这一点。非常感谢,我在这里呆了几天,谢谢你的帮助!
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
(:) <$> f :: ((->) a) ([a] -> [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]