作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我注意到我有很多函数可以为我的值添加某种标签。例如,考虑这两种数据类型:
data Named a = Named String a
data Colored a = White a | Black a
name :: Foo -> Named Foo
color :: Named Foo -> Colored (Named Foo)
class Tag f where
separate :: f a -> (forall b. b -> f b, a)
fx = let (f, x) = separate fx in f x
uncurry ($) . separate = id
Tag
也可以成为
Functor
的子类前提是
fmap g fx = let (f, x) = separate fx in f (g x)
instance Tag Named where
separate (Named name x) = (Named name, x)
instance Tag Colored where
separate (White x) = (White, x)
separate (Black x) = (Black, x)
instance Tag Identity where
separate (Identity x) = (Identity, x)
instance (Tag f, Tag g) => Tag (Compose f g) where
separate (Compose fgx) =
let (f, gx) = separate fgx in
let (g, x) = separate gx in
(Compose . f . g, x)
reorder :: (Tag f, Tag g) => f (g a) -> g (f a)
reorder fgx =
let (f, gx) = separate fgx in
let (g, x) = separate gx in
g (f x)
最佳答案
user2407038's comment确实触及了它的核心,因为您最终要表达的概念归结为与某个对仿函数同构的仿函数——毕竟,对是一个附加了其他东西的值。从这个角度来看,有一些可能有趣的额外事情需要注意。
为方便起见,我将假设您的 Tag
s 是 Functor
s(您提到的相关条件通过参数化成立),并通过替换 forall b. b -> f b
来简化类型与同构f ()
.那么我们可能有:
separate :: Tag f => f a -> (f (), a)
slot . separate = id
slot :: Functor f => (f (), a) -> f a
slot (sh, a) = fmap (const a) sh
slot
的要求应该是满射的(就您的用例而言,这是完全合理的),
slot
升级为完全逆,从而为我们提供了
f a
之间的同构和
(f (), a)
.
splitL :: Adjunction f u => f a -> (a, f ())
unsplitL :: Functor f => a -> f () -> f a
Representable
,即同构于函数仿函数。
dfeuer's suspicion是,在某种程度上,是合理的,虽然附加词没有给我们左伴随对应物
Distributive
或
Representable
.这是他们的草图,并有名字:
class Traversable t => Lone t where
codistribute :: Functor f => t (f a) -> f (t a)
surround :: Functor f => (a -> f b) -> t a -> f (t b)
class Lone f => Detachable f where
type Corep f
cotabulate :: (Corep f, a) -> f a
coindex :: f a -> (Corep f, a)
Traversable
的几点说明联系:
codistribute
和 surround
只是 sequenceA
和 traverse
,分别,除了 Applicative
约束放宽到 Functor
(如果始终只有一个值,则不需要 Applicative
)。 cotabulate
和 coindex
(或 slot
和 separate
,或 unsplitL
和 splitL
)可以看作是 the shape-and-contents decomposition of traversable functors 的表现形式(其中我们不需要内容的列表/向量,因为同样,总是只有一个值)。 Detachable
进行翻译。 .对于 Comonad
,甚至不需要,因为 Lone
就足够了(另见 extractL
and duplicateL
来自附件)。 surround
是一个 van Laarhoven 镜头(一个 Lens (t a) (t b) a b
,用镜头的说法),就像 traverse
是 van Laarhoven 遍历 ( Traversal (t a) (t b) a b
)。 codistribute
是您的
reorder
的概括.
关于haskell - 这个仿函数式标签的类型类的名称是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37039042/
我是一名优秀的程序员,十分优秀!