Почему не прелюдия Хаскелла.читать Возвращение может быть?
есть ли веская причина, почему тип прелюдии.читать-это
read :: Read a => String -> a
вместо того, чтобы возвращать Maybe
значение?
read :: Read a => String -> Maybe a
поскольку строка может не быть разбираемой Haskell, не будет ли последняя более естественной?
или даже Either String a
, где Left
будет содержать исходную строку, если она не разбирается, и Right
результат, если это так?
Edit:
Я не пытаюсь заставить других писать соответствующая обертка для меня. Просто ищу заверения, что это безопасно.
5 ответов:
Edit: начиная с GHC 7.6,
readMaybe
доступныText.Read
библиотека в базе, вместе сreadEither
: http://hackage.haskell.org/packages/archive/base/latest/doc/html/Text-Read.html#v:readMaybe
большой вопрос! Сам тип чтения не меняется в ближайшее время, потому что это сломает много вещей. Однако, есть должны быть .
Почему нет? Ответ - "инерция". Там был а обсуждение '08 который был сорван дискуссией по поводу " неудачи."
хорошая новость заключается в том, что люди были достаточно убеждены, чтобы начать уходить от неудачи в библиотеках. Плохая новость заключается в том, что предложение затерялся. Там должны будьте такой функцией, хотя ее легко написать (и есть миллионы очень похожих версий, плавающих вокруг многих кодовых баз).
см. также этот обсуждение.
лично я использую версию от безопасный пакет.
Да, это было бы удобно с функцией чтения, которая возвращает возможно. Вы можете сделать один самостоятельно:
readMaybe :: (Read a) => String -> Maybe a readMaybe s = case reads s of [(x, "")] -> Just x _ -> Nothing
помимо инерции и / или изменения представлений, другая причина может заключаться в том, что эстетически приятно иметь функцию, которая может действовать как своего рода обратная
show
. То есть, вы хотите, чтобыread . show
личность (для типов, которые являются экземпляромShow
иRead
) иshow . read
это идентичность на диапазонеshow
(т. е.show . read . show == show
)имеющего
Maybe
в типаread
нарушает симметрию сshow :: a -> String
.
как указал @augustss, вы можете сделать свою собственную безопасную функцию чтения. Впрочем, его
readMaybe
не полностью согласуется с read, так как он не игнорирует пробелы в конце строки. (Я сделал эту ошибку один раз, я не совсем помню контекст)смотреть на!--7-->определение прочитанного в отчете Haskell 98, мы можем изменить его для реализации
readMaybe
что вполне согласуется сread
, а это не слишком неудобно, потому что все функции, от которых это зависит, определены в прелюдии:readMaybe :: (Read a) => String -> Maybe a readMaybe s = case [x | (x,t) <- reads s, ("","") <- lex t] of [x] -> Just x _ -> Nothing
эта функция (называется
readMaybe
) Теперь в прелюдии Хаскелл! (По состоянию на текущую базу -- 4.6)