Почему данные.Строка.Класс типов isString определяет только одно преобразование?

#string #haskell

#строка #haskell

Вопрос:

Почему базовый пакет Haskell определяет только IsString класс для преобразования из String в значение типа ‘like-string’ и не определяет обратное преобразование из значения типа ‘like-string’ в String ?

Класс должен быть определен как:

 class IsString a where
    fromString :: String -> a
    toString :: a -> String
 

ссылка: http://hackage.haskell.org/packages/archive/base/4.4.0.0/doc/html/Data-String.html

Комментарии:

1. Я не знаю Haskell, но вы, вероятно, могли бы создать свой собственный обратный.

Ответ №1:

Причина в том, что, по моему МНЕНИЮ, основная цель этого IsString — использовать строковые литералы в исходном коде Haskell (или (E) DSL — см. Также Paradise: двухэтапный DSL, встроенный в Haskell) через расширение OverloadedStrings языка аналогично тому, как работают другие полиморфные литералы (например, через fromRational for с плавающей запятойлитералы или fromInteger для целых литералов)

Этот термин IsString может немного вводить в заблуждение, поскольку он предполагает, что класс типа представляет строковые структуры, тогда как на самом деле он предназначен только для обозначения типов, которые имеют строковое представление в кавычках в исходном коде Haskell.

Комментарии:

1. Обратите внимание также, что в таких пакетах, как mysql-simple, есть некоторые типы, которые используют OverloadedStrings (а не более безопасный метод, такой как QuasiQuotation), чтобы обеспечить более простой способ построения значений, но обратное не всегда может быть возможным (или уникальным).

2. Я думаю о проблеме, когда я использовал флаг OverloadedStrings с помощью Aeson, он удаляет все «имя» пакета. Но в другом контексте y уже необходимо распаковать байтовую строку в строку.

Ответ №2:

Если вы хотите использовать toString :: a -> String , я думаю, вы просто забываете о show :: a -> String или, точнее Show a => show :: a -> String .

Если вы хотите работать с типом, имеющим :: a -> String и :: String -> a , вы можете просто наложить эти ограничения класса типа на функции.

 doubleConstraintedFunction :: Show a, IsString a => a -> .. -> .. -> a
 

Мы тщательно отмечаем, что мы избегаем определения классов типов, имеющих набор функций, которые также могут быть разделены на два подкласса. Поэтому мы не вводим toString IsString .

Наконец, я должен также упомянуть о Read , который обеспечивает Read a => String -> a . Вы используете read и show для очень простой сериализации. fromString from IsString имеет другое назначение, оно полезно для языка pragma OverloadedStrings , тогда вы можете очень удобно вставлять код, подобный "This is not a string" :: Text . ( Text является (эффективной) структурой данных для строк)

Комментарии:

1. проблема в show :: Show a => a -> String том, что он не просто выполняет преобразование типа в a String , но также добавляет кавычки и экранирование символов, чтобы обеспечить строковое представление в грамматике Haskell. Таким образом, fromString . show это не эквивалентно id тому, что вы, кажется, предлагаете. Вы действительно пробовали свою backAndForth функцию?

2. Я не предполагал, что это эквивалентно (это не так), я хотел продемонстрировать, что функция может иметь несколько ограничений типа. Но я понимаю, что backAndForth это очень вводящее в заблуждение имя, однако я компенсировал это комментарием в коде. В любом случае я отредактировал сообщение, чтобы оно было еще понятнее.

3. Я также удалил реализацию и переименовал функцию, я согласен, что это в основном сбивает с толку.