Есть ли веская причина, по которой тип Prelude.read
read :: Read a => String -> a
вместо возврата Maybe
значения?
read :: Read a => String -> Maybe a
Поскольку строка может не поддаваться синтаксическому анализу Haskell, не будет ли последнее более естественным?
Или даже Either String a
, где Left
бы содержалась исходная строка, если бы она не анализировалась, и Right
результат, если бы это было?
Редактировать:
Я не пытаюсь заставить других написать за меня соответствующую оболочку. Просто ищу подтверждения, что это безопасно.
take
принимаетNum a => a
? Почему используется специальный случайfmap
для списков? ПочемуFunctor
не требуется дляMonad
инстансов? Я ожидаю, что ответ будет аналогичен ответам на эти и связанные с ними вопросы.readMaybe
функция скоро будет добавлена.take
бытьIntegral n => n -> [a] -> [a]
?Integral
, а неNum
- мозговой пердун.Ответы:
Изменить : Начиная с GHC 7.6,
readMaybe
он доступен вText.Read
модуле в базовом пакете вместе сreadEither
: http://hackage.haskell.org/packages/archive/base/latest/doc/html/Text-Read.html#v: читатьОтличный вопрос! Сам тип чтения в ближайшее время не изменится, потому что это может сломать многое. Однако должна быть
maybeRead
функция.Почему нет? Ответ - «инерция». В '08 была дискуссия, которая была сорвана обсуждением «провала».
Хорошая новость заключается в том, что люди были достаточно убеждены, чтобы избавиться от неудач в библиотеках. Плохая новость в том, что предложение потерялось в беспорядке. Там должна быть такой функция, хотя один легко писать (и есть миллиард очень похожих версии плавающий вокруг много баз коды).
См. Также это обсуждение .
Лично я использую версию из безопасного пакета .
источник
Да, было бы удобно с функцией чтения, которая возвращает Maybe. Вы можете сделать его сами:
источник
Read a
класс типов:readMaybe :: Read a => String -> Maybe a
Помимо инерции и / или изменчивого понимания, другой причиной может быть то, что эстетически приятно иметь функцию, которая может действовать как своего рода обратная
show
. То есть вы хотите, чтобыread . show
это идентификатор (для типов, являющихся экземпляромShow
иRead
), и этоshow . read
идентификатор в диапазонеshow
(т.е.show . read . show == show
)Имея
Maybe
в видуread
нарушает симметрию сshow :: a -> String
.источник
newtype ValidShow a = ValidShow String
. Фантомный тип делает его более безопасным.showThing :: Show a => a -> ValidShow a
иreadThing :: Read a => ValidShow a -> a
, чтобы тип показанного объекта запомнился в объекте ValidShow. Так писать нельзяreadThing (showThing True) :: String
.Как отметил @augustss, вы можете создать свою собственную функцию безопасного чтения. Однако его использование
readMaybe
не полностью соответствует read, поскольку оно не игнорирует пробелы в конце строки. (Я однажды допустил эту ошибку, не совсем помню контекст)Глядя на определение чтения в отчете Haskell 98 , мы можем изменить его, чтобы реализовать
readMaybe
полностью согласованный с нимread
, и это не слишком неудобно, потому что все функции, от которых он зависит, определены в Prelude:источник
safe
пакет, вы получите правильнуюreadMaybe
доступную версию (она называется,readMay
и она идентична этой версии.Эта функция (вызываемая
readMaybe
) теперь находится в прелюдии к Haskell! (По текущей базе - 4,6)источник