Почему не прелюдия Хаскелла.читать Возвращение может быть?
есть ли веская причина, почему тип прелюдии.читать-это
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)