gpt4 book ai didi

haskell - 代数数据类型的特定用例

转载 作者:行者123 更新时间:2023-12-01 04:07:51 24 4
gpt4 key购买 nike

我正在编写一个通用枚举器来抓取网站作为练习,我做到了,它是完整的并且工作正常,但我有一个问题。你可以在这里找到它:https://github.com/mindreader/scrape-enumerator如果你想看代码。

基本想法是我想要一个枚举器,它可以在搜索引擎、博客等页面上吐出站点定义的条目,您必须获取页面,它将有 25 个条目,并且您一次需要一个条目。但同时我不想为每个站点编写管道,所以我想要一个通用接口(interface)。我想出的是这个(这使用类型系列):

class SiteEnum a where
type Result a :: *
urlSource :: a -> InputUrls (Int,Int)
enumResults :: a -> L.ByteString -> Maybe [Result a]

data InputUrls state =
UrlSet [URL] |
UrlFunc state (state -> (state,URL)) |
UrlPageDependent URL (L.ByteString -> Maybe URL)

为了在每种类型的网站上执行此操作,这需要某种 url 源,它可以是预生成 url 的列表(可能是无限的),或者它可以是初始状态以及从中生成 url 的东西(例如,如果url 包含 &page=1、&page=2 等),然后对于像谷歌这样的真正搞砸的页面,给出一个初始 url,然后提供一个函数,该函数将在正文中搜索下一个链接,然后使用它。您的站点使数据类型成为 SiteEnum 的实例,并为 Result 提供一个类型,该类型取决于站点,现在枚举器处理所有 I/O,您不必考虑它。这很好用,我用它实现了一个站点。

我的问题是这个实现有一个烦恼是 InputUrls 数据类型。当我使用 UrlFunc 时,一切都是金色的。当我使用 UrlSet 或 UrlPageDependent 时,由于状态类型未定义,它并不全是乐趣和游戏,我必须将其强制转换为::InputUrls () 才能编译。这似乎完全没有必要,因为由于程序的编写方式,该类型变量永远不会用于大多数站点,但我不知道如何解决它。我发现我想在很多不同的上下文中使用这样的类型,而且我总是会得到只在某些数据类型中需要的杂散类型变量,但我觉得我不应该使用这样。有没有更好的方法来做到这一点?

最佳答案

为什么需要 UrlFunc案例呢?据我了解,您对 state 函数所做的唯一一件事就是使用它来构建一个列表,如 UrlSet 中的列表。无论如何,所以不要存储状态函数,只需存储结果列表。这样,您可以消除 state数据类型中的类型变量,这应该消除歧义问题。

关于haskell - 代数数据类型的特定用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8217312/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com