【问题标题】:How can i understand this Traversable implementation for lists [closed]我如何理解列表的这个 Traversable 实现 [关闭]
【发布时间】:2016-10-28 09:25:31
【问题描述】:

我无法理解以下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) []

特别是(&lt;*&gt;) 类型的以下推导有什么问题?

(:)    :: 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

【问题讨论】:

  • 能否请您更准确地说明您不了解的内容?你可以折叠FunctorApplicative 了吗?很难知道一个人需要写多少才能以目前的形式回答您的问题。
  • 是的,我对 Functor 和 Applicative 有所了解。 (:) f a b ::f [b] 怎么可能? (:) :: a->[a]->[a], ():: a->b->f a->f b, (:) 应该是 f (a->[ a])->f [a]?
  • 您应该编辑您的问题以添加您刚才所说的内容。这样一来,它就不太可能因为不清楚或过于宽泛而最终被忽略或关闭。
  • 请注意,如果您在原始问题中清楚地解释了您想问的问题,那么您得到的五次反对票是完全可以避免的。请记住这一点,以备将来提问。
  • 非常感谢

标签: haskell traversable


【解决方案1】:

下面的推导有什么问题?

问题在于这段话:

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

函数应用程序总是优先于任何运算符,因此(:) &lt;$&gt; f a 不是((:) &lt;$&gt; f) a,如您的推导,而是(:) &lt;$&gt; (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]

【讨论】:

  • 知道了,在这里住了几天,谢谢你的帮助!
猜你喜欢
  • 1970-01-01
  • 2012-12-03
  • 2022-06-16
  • 1970-01-01
  • 1970-01-01
  • 2011-12-08
  • 2014-05-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多