美好的一天,我尝试在我的项目中使用TagSoup库并坚持开始。
Tagsoup有一些StringIike类用于某些我认为很荣幸的目的,我无法理解如何应对它的属性。我写了函数:
parseFile :: (StringLike str) => String -> IO [Tag str]
parseFile f = do
html <- readFile f
return $ parseTags html
给了我:
无法匹配预期类型
str' against inferred type
[Char]'
str' is a rigid type variable bound by the type signature for
parseFile'预期类型:IO [Tag str]推断类型:IO [Tag String]
但TagSoup的'parseTags'函数具有这样的签名并且效果很好:
parseTags :: StringLike str => str -> [Tag str]
如果我将其签名更改为:
,我的工作正常parseFile :: String -> IO [Tag String]
但我喜欢我的函数还有这个typeclassed签名,不是严格的String,如何实现呢?
答案 0 :(得分:3)
请注意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)
我没有对它进行过测试,但这应该可以胜任。