В каких сценариях Haskell `reads` возвращает более одного элемента списка?
Я могу сделать следующее:
Prelude> reads "1 2 3" :: [(Int, String)]
[(1," 2 3")]
Prelude> reads "(1,2) (3,4)" :: [((Int, Int), String)]
[((1,2)," (3,4)")]
Prelude> reads "(1,2)(3,4)" :: [((Int, Int), String)]
[((1,2),"(3,4)")]
Prelude> reads "(1,2)\n(3,4)" :: [((Int, Int), String)]
[((1,2),"\n(3,4)")]
Prelude> reads "(1,2) (3,4)" :: [((Int, Int), String)]
[((1,2)," (3,4)")]
Я могу получить Read
и получить чтение, чтобы прочитать их тоже. Но я никогда не читал, чтобы возвращать более одного кортежа в списке. Почему reads
возвращает список?
Ответы
Ответ 1
Ни один из стандартных экземпляров не делает этого, но он предназначен для двусмысленных разбора; так как это не очень полезно, и синтаксические анализаторы, которые используют эту функциональность, будут очень неэффективными, reads
возвращаемое значение для всех практических целей Maybe
маскируется как []
.
Описание Report read
показывает предполагаемое значение нескольких парсов:
read :: (Read a) => String -> a
read s = case [x | (x,t) <- reads s, ("","") <- lex t] of
[x] -> x
[] -> error "PreludeText.read: no parse"
_ -> error "PreludeText.read: ambiguous parse"
Итак: исторические причины, в основном.
Ответ 2
Вы можете определить экземпляры Read
для ваших типов данных, которые могут возвращать более одного элемента в reads
. Я не сталкивался с ситуацией, когда это имело бы смысл, но это возможно.