#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
том, что он не просто выполняет преобразование типа в aString
, но также добавляет кавычки и экранирование символов, чтобы обеспечить строковое представление в грамматике Haskell. Таким образом,fromString . show
это не эквивалентноid
тому, что вы, кажется, предлагаете. Вы действительно пробовали своюbackAndForth
функцию?2. Я не предполагал, что это эквивалентно (это не так), я хотел продемонстрировать, что функция может иметь несколько ограничений типа. Но я понимаю, что
backAndForth
это очень вводящее в заблуждение имя, однако я компенсировал это комментарием в коде. В любом случае я отредактировал сообщение, чтобы оно было еще понятнее.3. Я также удалил реализацию и переименовал функцию, я согласен, что это в основном сбивает с толку.