Почему класс типов Data.String.IsString определяет только одно преобразование? - PullRequest
13 голосов
/ 21 октября 2011

Почему базовый пакет Haskell определяет только класс IsString для преобразования из String в значение 'like-string', но не определяет обратное преобразование из значения 'like-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

Ответы [ 3 ]

15 голосов
/ 21 октября 2011

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

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

6 голосов
/ 21 октября 2011

Если вы хотите использовать 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 - это (эффективная) структура данных для строк)

1 голос
/ 21 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...