首页 文章

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

提问于
浏览
2

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

对于实例与类型本身在同一文件中定义的情况(例如Data.Sequence),'s listed in the docs. For the example, I'与Hoogle或Hayoo没有任何好运 .

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


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

1 回答

  • 6

    并反对“[]”而不是“列表”

    嗯...没有 List (至少not in the standard library)这样的类型!

    Haskell实例也可以在类的模块中和数据类型模块中一样定义(或者实际上在其他任何地方定义,但是相反避免使用这样的孤立实例) . 选择取决于哪个模块更多"fundamental":更古怪的模块将依赖于更标准的模块,并且只有在类和类型都在范围内时才能定义实例 . 因为 [] 一直是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'中定义

    现在,当然这甚至都没有赢得范围 . 它不应该:任何人都可以在一些恰好安装在你系统上的软件包中为自己的模糊类型定义实例;它不会在一个更大的框架中使用"standard imports",你将获得所有“标准实例,就像

    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'中定义Prelude Yesod>:i Text.Blaze.Internal.MarkupM类型角色Text.Blaze.Internal.MarkupM幻像数据Text.Blaze.Internal.MarkupM a其中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 a Text.Blaze.Internal.CustomParent :: Text.Blaze.Internal.ChoiceString - >(Text.Blaze.Internal.MarkupM b) - > Text.Blaze.Internal.MarkupM a Text.Blaze.Internal .Leaf :: Text.Blaze.Internal.StaticString - > Text.Blaze.Internal.StaticString - > Text.Blaze.Internal.StaticString - > Text.Blaze.Internal.MarkupM a Text.Blaze.Internal.CustomLeaf :: Text . Blaze.Internal.ChoiceString - > Bool - > Text.Blaze.Internal.MarkupM aText.Blaze.Internal.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 a Text.Blaze.Internal.AddAttribute :: Text.Blaze.Internal.StaticString - > Text.Blaze.Internal.StaticString - > Text.Blaze.Internal . ChoiceString - >(Text.Blaze.Internal.MarkupM a) - > Text.Blaze.Internal.MarkupM a 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网站Html - 在'Yesod.Core中定义.Widget'实例渲染~Yesod.Core.Types.RY site => To WidgetHead站点(render - > Html) - 在'Yesod.Core.Widget'实例中定义ToWidgetBody站点Html - 在'Yesod.Core.Widget'实例中定义渲染~Yesod.Core.Types.RY site => ToWidgetBody站点( render - > Html) - 在'Yesod.Core.Widget'实例中定义ToWidget网站Html - 在'Yesod.Core.Widget'实例中定义渲染~Yesod.Core.Types.RY site => ToWidget site(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'中定义

相关问题