Functor实现`((,)e)`,类型注释容器在哪里?

时间:2017-05-21 00:21:33

标签: haskell tuples typeclass functor

Typeclassopedia((,) e)列为Functor的实例,并将其描述如下。

  

((,) e)表示一个容器,它包含e类型的“注释”及其保存的实际值。将其写为(e,)可能更清楚,类似于(1+)之类的运算符部分,但类型中不允许使用该语法(尽管在TupleSections扩展名的表达式中允许使用该语法启用)。但是,您当然可以将其视为(e,)

我正在研究各种类型类的实现,以提高我的理解。目前正在查看Functor实现,但似乎找不到其中的一些,例如((,) e)((->) e)((,) e)实现的仿函数实例在哪里?

3 个答案:

答案 0 :(得分:3)

Here it is

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)会转换考虑了上下文的值。