Почему 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,

Другие вопросы по тегам