Подтвердить что ты не робот

Почему typeclass Data.String.IsString определяет только одно преобразование?

Почему базовый пакет Haskell определяет класс IsString, чтобы преобразовать значение String в значение "как-строка", а не определять обратное преобразование, от значения "как-строка" до String

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

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

ref: http://hackage.haskell.org/packages/archive/base/4.4.0.0/doc/html/Data-String.html

4b9b3361

Ответ 1

Причиной является ИМХО, что IsString основная цель должна использоваться для строковых литералов в исходном коде Haskell (или (E) DSLs - см. также Рай: двухступенчатый DSL, встроенный в Haskell) через расширение языка OverloadedStrings аналогично тому, как работают другие полиморфные литералы (например, через fromRational для литералов с плавающей запятой или fromInteger для целых литералов)

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

Ответ 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 из IsString имеет другую цель, он полезен с языком pragma OverloadedStrings, тогда вы можете очень удобно вставить код типа "This is not a string" :: Text. (Text является (эффективной) структурой данных для строк)

Ответ 3

Если вы хотите преобразовать Things into Strings и reverse, вы должны использовать классы Show and Read. Если вы хотите конвертировать между различными строковыми структурами, IsString - ваш путь. Оба способа поддерживают преобразования, такие как a- > String и String- > a.