哈斯克尔。纠结于String,类型类和TagSoup库

时间:2011-09-03 06:02:59

标签: haskell

美好的一天,我尝试在我的项目中使用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,如何实现呢?

1 个答案:

答案 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)

我没有对它进行过测试,但这应该可以胜任。