Почему ByteString не преобразуется автоматически в FilePath?
Я прохожу (строго) ByteString
к чему-то ожидающему 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
2 ответа
{-# LANGUAGE OverloadedStrings #-}
Прагма работает только для строковых литералов, как "a string"
, В этом случае Хаскелл неявно помещает fromString
перед каждым строковым литералом, поэтому он переписывает строковый литерал как "a string"
в fromString "a string"
, Это происходит только для литералов.
В Хаскеле, насколько я знаю, нет неявных преобразований. Преобразования между например Int
а также Float
все явно.
Кроме того, обратите внимание, что IsString
у класса типов только есть функция fromString :: String -> a
, Так что это означает, что он работает только от строки к этому экземпляру (здесь ByteString
), А не наоборот.
Вы можете использовать unpack :: ByteString -> String
преобразовать ByteString
к String
,
IIRC, OverloadedStrings
Расширение не позволяет магическое преобразование между различными типами данных. Что он делает, это когда вы пишете строковый литерал, как "foo"
компилятор может трактовать этот литерал не только как String
, но также как ByteString
,
Вам, вероятно, нужно что-то вроде unpack
преобразовать ByteString
в String
,