gpt4 book ai didi

haskell 。与 String、类型类和 TagSoup 库纠缠在一起

转载 作者:行者123 更新时间:2023-12-02 16:52:11 27 4
gpt4 key购买 nike

美好的一天,我尝试在我的项目中使用 TagSoup 库,但一直停留在开始阶段。

Tagsoup 有 StringLike 类,我想这是为了某些荣耀的目的,但我不明白如何正确处理它。我写的函数:

parseFile :: (StringLike str) => String -> IO [Tag str]
parseFile f = do
html <- readFile f
return $ parseTags html

这给了我:

Couldn't match expected type str' against inferred type[Char]'
str' is a rigid type variable bound by
the type signature for
parseFile' Expected type: IO [Tag str] Inferred type: IO [Tag String]

但是 TagSoup 的“parseTags”函数具有这样的签名并且运行良好:

parseTags :: StringLike str => str -> [Tag str]

如果我将其签名更改为:

,我的工作正常
parseFile :: String -> IO [Tag String]

但是我喜欢我的函数也重新定义这个类型分类签名,而不是严格的字符串,如何实现这一点?

最佳答案

注意parseTags的类型:

parseTags :: StringLike str => str -> [Tag str]

类型变量 str 在输入和输出中必须相同。由于输入来自 readFile::FilePath -> IO String,因此输入将是 String,因此输出必须是 [Tag String].

但是,StringLike 类包含函数 fromString :: StringLike str => String -> str ,因此可以使用该函数进行类型转换。

parseFile :: (StringLike str) => String -> IO [Tag str]
parseFile f = do
html <- readFile f
return $ parseTags (fromString html)

我还没有测试过它,但这应该可以完成工作。

关于 haskell 。与 String、类型类和 TagSoup 库纠缠在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7291462/

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