Typeclassopedia将((,) e)
列为Functor
的实例,并将其描述如下。
((,) e)
表示一个容器,它包含e类型的“注释”及其保存的实际值。将其写为(e,)
可能更清楚,类似于(1+)
之类的运算符部分,但类型中不允许使用该语法(尽管在TupleSections
扩展名的表达式中允许使用该语法启用)。但是,您当然可以将其视为(e,)
。
我正在研究各种类型类的实现,以提高我的理解。目前正在查看Functor实现,但似乎找不到其中的一些,例如((,) e)
和((->) e)
。 ((,) e)
实现的仿函数实例在哪里?
答案 0 :(得分:3)
instance Functor ((,) a) where
fmap f (x,y) = (x, f y)
通常,查找实例的便捷方法是查看the documentation entry for the class中的实例列表或数据类型的实例列表(几乎在所有情况下,您都会在至少一个中查找实例)他们)并遵循源链接。
正如Li-yao Xia在a comment中所说,另一条路线在GHCi中使用:i (,)
,它将列出(,)
范围内的所有实例及其定义的模块。 (在这种特定情况下,恰好是GHC.Base
,不能通过the entry page for the base docs直接访问,但可以在the source tree listing中找到,也可以通过分散在文档中的源链接找到,例如Data.Functor
中的实例列表中的那个。)
答案 1 :(得分:0)
它在Control.Monad(以及其他地方)中声明。该文档包括GHC的a link to the source。其他实现可能会有所不同。
答案 2 :(得分:0)
((,) e)
在Control.Comonad
中也有一个非常“容器化”的comonad实例:
extract :: (e, a) -> a
会丢弃上下文并返回值。我有时会使用此代替snd
。duplicate :: (e, a) -> (e, (e, a))
将值和上下文放在值中。extend :: ((e, a) -> b) -> (e, a) -> (e, b)
会转换考虑了上下文的值。