Haskell 为什么不是';t ByteString是否自动转换为文件路径?

Haskell 为什么不是';t ByteString是否自动转换为文件路径?,haskell,type-conversion,bytestring,overloaded-strings,Haskell,Type Conversion,Bytestring,Overloaded Strings,我正在通过testring将一个(严格的)传递给某个需要System.IO.FilePath的对象,该对象被声明为type FilePath=String。我还使用了{-#语言重载字符串{-}。我已经在一些地方转换自动发生,但在这里它没有。我做错了什么 Main.hs:33:40: error: • Couldn't match type ‘ByteString’ with ‘[Char]’ Expected type: FilePath Actual typ

我正在通过testring将一个(严格的)
传递给某个需要
System.IO.FilePath
的对象,该对象被声明为
type FilePath=String
。我还使用了
{-#语言重载字符串{-}
。我已经在一些地方转换自动发生,但在这里它没有。我做错了什么

Main.hs:33:40: error:
    • Couldn't match type ‘ByteString’ with ‘[Char]’
      Expected type: FilePath
        Actual type: ByteString

IIRC,
OverloadedStrings
扩展无法在不同类型的数据之间实现神奇的转换。它所做的是,当您编写一个类似
“foo”
的字符串文字时,编译器不仅可以将该文字视为
字符串
,还可以将其视为
ByteString

您可能需要像
unpack
这样的东西来将
ByteString
转换为
String
{-#语言重载字符串}
pragma仅适用于字符串文本,如
字符串
。在这种情况下,Haskell隐式地将
fromString
放在每个字符串文本之前,因此它将字符串文本重写为
“字符串”
fromString“字符串”
。这只发生在文本中

据我所知,在Haskell中,没有隐式转换。例如
Int
Float
之间的转换都是显式的

此外,请注意typeclass只有一个函数
fromString::String->a
。这意味着它只能从一个字符串到那个实例(这里是
ByteString
),而不是相反


您可以使用来将
ByteString
转换为
字符串

简言之,Haskell中根本不会发生自动转换。所有转换都是显式完成的。但请注意,
unpack
对于大多数编码来说都是错误的。当然,还要注意,
文件路径的含义也取决于隐藏在幕后的编码设置。如果您使用的是Linux,那么只需使用一个文件API,它首先使用
ByteString
作为文件名,就可以避免很多麻烦。