繁体   English   中英

理解(可交换产品)类型

[英]Understanding (Traversable Product) Type

鉴于以下fp课程

data Product f g a =
  Product (f a) (g a)

class Functor f where
  -- Pronounced, eff-map.
  (<$>) ::
    (a -> b)
    -> f a
    -> f b

class Functor f => Applicative f where
  pure ::
    a -> f a
  (<*>) ::
    f (a -> b)
    -> f a
    -> f b

我试图为Product fga定义Traversable实例:

instance (Traversable f, Traversable g) =>
  Traversable (Product f g) where
  traverse :: 
    Applicative h =>
    (a -> h b)
    -> Product f g a
    -> h (Product f g b)  
  traverse fn (Product fa ga) = Product (traverse fn fa) (traverse fn ga)

编译器显示错误:

src/Course/Traversable.hs:106:33: error:
    • Occurs check: cannot construct the infinite type: h ~ Product h h
      Expected type: h (Product f g b)
        Actual type: Product h h (f b)

我理解我的定义是错误的,但我不明白实际类型是怎样的Product hh (fb)

打破Product (traverse fn fa) (traverse fn ga)的类型,我相信它是:

Product (h (f b)) (h (g b))

因为traverse的签名是Applicative f => (a -> fb) -> ta -> f (tb)

根据Product hh (fb)的实际类型Product hh (fb)g在哪里? 请解释上面的实际类型。

是。 你有

traverse :: (a -> h b) -> f a -> h (f b)
traverse    fn            fa  :: h (f b)   -- and,

traverse :: (a -> h b) -> g a -> h (g b)
traverse    fn            ga  :: h (g b)

从而

Product (traverse fn fa)  (traverse fn ga) :: Product h h (f b)
        (h        (f b))  (h        (g b))

because Product pqt is defined as 因为Product pqt被定义为

Product (p        t    )  (q        t    )
------------------------------------------
       p ~ h   t ~ f b    q ~ h    t ~ g b

因此,明确地将Product应用于两个traverse结果并没有成功。

但是,这两个具有类型h (fb)h (gb)以及h是一个应用型的,我们寻求创造型的结果h (Product fgb) 与内部的 组合式 h ,所以如果我们能有

         h (f b)           h (g b)              h r              h s
        ---------------------------            ----------------------
         h (Combined  (f b)  (g b))             h (Combined   r    s)

事实上既然两个b都是一样的,

        ---------------------------
         h (Combined   f      g b )

所以从foo :: r -> s -> t我们想得到bar :: hr -> hs -> ht ...如果只有这样的函数...

baz :: (Applicative h) => (r -> s -> t) -> (h r -> h s -> h t)

...所以答案是liftA2 Product (traverse fn fa) (traverse fn ga) ,将数据构造函数Product应用于两个遍历的“内部结果”中的“”内部“”在“的封面下” )Applicative :

         h r       h s
           r   ->    s   ->   t
        ------------------------
         h                    t

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM