4

我将 a (strict) 传递ByteString给期望 a 的东西System.IO.FilePath,它被声明为type FilePath = String. 我也在用{-# LANGUAGE OverloadedStrings #-}。我已经在某些地方自动进行了转换,但这里没有。我做错了什么?

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

2 回答 2

13

{-# LANGUAGE OverloadedStrings #-}pragma 仅适用于字符串文字,例如"a string". 在这种情况下,Haskell 会在每个字符串文字之前隐式放置 a fromString,因此它会将字符串文字"a string"重写为fromString "a string". 这只发生在文字上。

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

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

您可以使用 将unpack :: ByteString -> String转换ByteStringString

于 2018-02-22T08:58:05.357 回答
4

IIRC,该OverloadedStrings扩展不能实现不同类型数据之间的神奇转换。它的作用是,当您编写类似的字符串文字时"foo",编译器不仅可以将该文字视为 a String,还可以将其视为 a ByteString

您可能需要unpack转换ByteStringString.

于 2018-02-22T08:12:35.947 回答