[英]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.