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