Почему 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
Ответы
Ответ 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.