Подтвердить что ты не робот

В каких сценариях 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 возвращает список?

4b9b3361

Ответ 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. Я не сталкивался с ситуацией, когда это имело бы смысл, но это возможно.