类型类实例可发现性 - 如何搜索?

Ric*_*ton 2 haskell

示例 - Data.List具有为Data.Foldable定义的实例,但它在Foldable中定义,而不是在List中(而不是"[]"而不是"List").

对于实例与类型本身在同一文件中定义的情况(例如Data.Sequence),它在文档中列出.例如,我对Hoogle或Hayoo没有任何好运.

虽然我可以看到最常见的事件是具有数据类型定义的实例定义,但是有时必须将它放在单独的文件中.我刚碰巧选择了一个使用Data.List的错误示例,还是我在搜索技能中遗漏了一些东西?


澄清:我已经了解可折叠和列表,并且期望每个人在探索Haskell时很早就遇到过这个问题是合理的.然而,对于某些复杂类型的T来自例如Snap/Yesod /镜头,我不太可能知道我从未遇到的一些更复杂的类型类是相关的.我想知道是否有某种方式明确搜索实例,因为它们没有在类型的文件中定义(可以在类型的自动生成的文档中获取它).

lef*_*out 6

并反对"[]"而不是"列表"

嗯...没有这样的类型List(至少不在标准库中)!

Haskell实例也可以在类的模块中和数据类型模块中一样定义(或者实际上在其他任何地方定义,但是相反避免使用这样的孤立实例).选择取决于哪个模块更"基本":更古怪的模块将依赖于更标准的模块,并且只有在类和类型都在范围内时才能定义实例.由于[]一直哈斯克尔的基本原则之一,而Foldable更更高级的通用编程特定接口的; 所以很自然地Foldable []只在Foldable模块中定义实例.

用于查找实例定义位置的最简单工具是GHCi.在你的例子中

Prelude>:m + Data.Foldable
Prelude Data.Foldable>:i Foldable
class Foldable(t ::* - >*)其中
  fold :: Data.Monoid.Monoid m => tm - > m
  foldMap :: Data.Monoid. Monoid m =>(a - > m) - > ta - > m
  Data.Foldable.foldr ::(a - > b - > b) - > b - > ta - > b
  foldr'::(a - > b - > b) - > b - > ta - > b
  Data.Foldable.foldl ::(b - > a - > b) - > b - > ta - > b
  foldl'::(b - > a - > b ) - > b - > ta - > b
  Data.Foldable.foldr1 ::(a - > a - > a) - > ta - > a
  Data.Foldable.foldl1 ::(a - > a - > a) - > ta - > a
  - 在'Data.Foldable'
实例中定义可折叠[] - 在'Data.Foldable'
实例中定义可折叠也许 - 在'Data.Foldable'
实例中定义可折叠(可以是a) - 在'数据中定义可折叠的'
实例可折叠((,)a) - 在'Data.Foldable'中定义

它的另一种方式也是如此:

Prelude Data.Foldable>:i []
data [] a = [] | a:[a] - 在'GHC.Types'
实例中定义 Eq a => Eq [a] - 在'GHC.Classes'
实例中定义 Monad [] - 在'GHC.Base'
实例中定义 Functor [] - - 在'GHC.Base'
实例中定义 Ord a => Ord [a] - 在'GHC.Classes'
实例中定义读a =>读[a] - 在'GHC.Read'
实例中定义显示=>显示[a] - 在'GHC.Show'
实例中定义 Foldable [] - 在'Data.Foldable'中定义

现在,当然这不会显示任何甚至不在范围内的实例.它不应该:任何人都可以在一些恰好安装在你系统上的软件包中为自己的模糊类型定义实例; 显示它们没有帮助.但如果你在一个更大的框架中并使用"标准导入",你将获得所有"标准实例",如

Prelude Yesod>:i Html
type Html = Text.Blaze.Internal.Markup
  - 在'Text.Blaze.Html'中定义
Prelude Yesod>:i Text.Blaze.Internal.Markup
type Text.Blaze.Internal.Markup = Text. Blaze.Internal.MarkupM()
  - 定义于"Text.Blaze.Internal"
前奏耶索德>:ⅰText.Blaze.Internal.MarkupM
类型的角色Text.Blaze.Internal.MarkupM幻象
数据Text.Blaze.Internal.MarkupM一个其中
  Text.Blaze.Internal.Parent :: Text.Blaze.Internal.StaticString - > Text.Blaze.Internal.StaticString - > Text.Blaze.Internal.StaticString - >(Text.Blaze.Internal.MarkupM
                                                                                                                                              b) - > Text. Blaze.Internal.MarkupM
                                                                                                                                                      一个
  Text.Blaze.Internal.CustomParent :: Text.Blaze.Internal.ChoiceString - >(Text.Blaze.Internal.MarkupM
                                                                            b) - > Text.Blaze.Internal.MarkupM
                                                                                    一个
  Text.Blaze.Internal.叶:: Text.Blaze.Internal.StaticString - > Text.Blaze.Internal.StaticString - > Text.Blaze.Internal.StaticString - > Text.Blaze.Internal.MarkupM
                                                                                                                                            一个
  Text.Blaze.Internal.CustomLeaf :: Text.Blaze .Internal.ChoiceString - > Bool - > Text.Blaze.Internal.MarkupM
                                                                                  a
  Text.Blaze.In ternal.Content :: Text.Blaze.Internal.ChoiceString - > Text.Blaze.Internal.MarkupM
                                                                      a
  Text.Blaze.Internal.Append ::(Text.Blaze.Internal.MarkupM
                                  b) - >(Text.Blaze.Internal. MarkupM
                                            C) - > Text.Blaze.Internal.MarkupM一个
  Text.Blaze.Internal.AddAttribute :: Text.Blaze.Internal.StaticString - > Text.Blaze.Internal.StaticString - > Text.Blaze.Internal.ChoiceString - >( Text.Blaze.Internal.MarkupM
                                                                                                                                                    一) - > Text.Blaze.Internal.MarkupM
                                                                                                                                                            一个
  Text.Blaze.Internal.AddCustomAttribute :: Text.Blaze.Internal.ChoiceString - > Text.Blaze.Internal.ChoiceString - >(Text.Blaze .Internal.MarkupM
                                                                                                                      a) - > Text.Blaze.Internal.MarkupM
                                                                                                                              a
  Text.Blaze.Internal.Empty :: Text.Blaze.Internal.MarkupM a
  - 在'Text.Blaze.Internal'
实例中定义 Monad Text.Blaze. Internal.MarkupM
  - 在'Text.Blaze.Internal'
实例中定义 Functor Text.Blaze.Internal.MarkupM
  - 在'Text.Blaze.Internal'
实例中定义 ToWidgetHead site Html - 在'Yesod.Core.Widget'
实例中定义 render~Yesod.Core.Types.RY site =>
        ToWidgetHead site(render - > Ht ml)
  - 在'Yesod.Core.Widget'
实例中定义 ToWidgetBody网站Html - 在'Yesod.Core.Widget'
实例渲染中定义 ~Yesod.Core.Types.RY site =>
        ToWidgetBody site(render - > Html)
  - - 在'Yesod.Core.Widget'
实例中定义ToWidget站点Html - 在'Yesod.Core.Widget'
实例渲染中定义~Yesod.Core.Types.RY site =>
        ToWidget站点(render - > Html)
  - 定义于'Yesod.Core.Widget'
例如ToTypedContent的Html -定义在'Yesod.Core.Content'
例如ToFlushBuilder的Html -定义在'Yesod.Core.Content'
例如ToContent的Html -定义在'Yesod.Core.Content'
实例HasContentType Html - 在'Yesod.Core.Content'
实例中定义[overlap ok] PersistField Html
  - 在'persistent-1.3.3:Database.Persist.Class.PersistField'中定义