Почему не прелюдия Хаскелла.читать Возвращение может быть?


есть ли веская причина, почему тип прелюдии.читать-это

read :: Read a => String -> a

вместо того, чтобы возвращать Maybe значение?

read :: Read a => String -> Maybe a

поскольку строка может не быть разбираемой Haskell, не будет ли последняя более естественной?

или даже Either String a, где Left будет содержать исходную строку, если она не разбирается, и Right результат, если это так?

Edit:

Я не пытаюсь заставить других писать соответствующая обертка для меня. Просто ищу заверения, что это безопасно.

5 97

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)