Haskell 哈斯克尔。与字符串、类型类和标记库纠缠在一起

Haskell 哈斯克尔。与字符串、类型类和标记库纠缠在一起,haskell,Haskell,早上好,我试图在我的项目中使用TagSoup库,但刚开始就遇到了问题 Tagsoup有一些类似StringLike的课程,我想这是一个光荣的目标,我不知道如何妥善处理它。我写了一个函数: parseFile :: (StringLike str) => String -> IO [Tag str] parseFile f = do html <- readFile f return $ parseTags html 如果我将其签名更改为: parseFile :: S

早上好,我试图在我的项目中使用TagSoup库,但刚开始就遇到了问题

Tagsoup有一些类似StringLike的课程,我想这是一个光荣的目标,我不知道如何妥善处理它。我写了一个函数:

parseFile :: (StringLike str) => String -> IO [Tag str]
parseFile f = do
  html <- readFile f
  return $ parseTags html
如果我将其签名更改为:

parseFile :: String -> IO [Tag String]

但是我喜欢我的函数也创建这个类型化的签名,而不是严格意义上的字符串,如何实现这一点?

注意
parseTags的类型

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

但是,
StringLike
类包含该函数,因此可以使用该函数转换类型

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

html很酷,它可以与fromString一起使用,但是还有其他方法吗?使用函数将字符串转换为实际相同的字符串对我来说似乎没有什么开销。没有开销,编译器将删除它。@Dfr:嗯,在
string
StringLike
实例中,
fromString=id
,因此几乎没有任何开销。当然,您可以尝试直接从文件将其加载到正确的类型中,但随后您必须为此创建另一个typeclass,因为
StringLike
没有任何类似
readFile
的操作;您正在从String转换为函数调用方所期望的任何StringLike类型,在某些情况下(但不是所有情况下)都是String。@Dfr:这种源代码开销是一种没有隐式类型转换的语言的折衷之一。其中一个好处是,parseTags可以非常通用,不关心您为它提供的实际类型是字符串还是bytestring,或者您可以定义的任何其他数据类型,其行为类似于字符串。
parseFile :: (StringLike str) => String -> IO [Tag str]
parseFile f = do
  html <- readFile f
  return $ parseTags (fromString html)