Я смущен результатом sepBy1
Следующий код работает в ghci
λ> import Text.ParserCombinators.ReadP
λ> import Data.Char
λ> readP_to_S ((munch1 isAlpha) `sepBy1` (char '-')) "dish-dash-dosh"
[(["dish"],"-dash-dosh"),(["dish","dash"],"-dosh"),["dish","dash","dosh"],"")]
- Почему это не так, что вывод
[(["dish","dash","dosh"],"")]
?
Следующий doctest
- это только один , который не удалось.
-- |
-- >>> readP_to_S readValues "dish-dash-dosh"
-- [(V ["dish","dash","dosh"],"")
readValues :: ReadP Value
readValues = do
xs <- (munch isAlpha) `sepBy1` (char '-')
pure $ V xs
Main.hs:64: failure in expression `readP_to_S readValues "dish-dash-dosh"'
expected: [(V ["dish","dash","dosh"],"")
but got: [(V ["dish"],"-dash-dosh"),(V ["dish","dash"],"-dosh"),(V ["dish","dash","dosh"],"")]
Я использую ReadP
для Read
экземпляр моих данных.Код для Read
экземпляра работает, но я в замешательстве.
Не было никакого сложного анализа, я всегда думаю, что выполнение ReadP
вернет вывод в виде списка из одного элемента [(result,"")]
, очевидно, это не так.
data Value = V [String]
deriving Show
-- |
-- >>> read "dish-dash-dosh" :: Value
-- V ["dish","dash","dosh"]
--
instance Read Value where
readPrec = readP_to_Prec (const readValues)
Это тот случай, когда
read
будет успешным, только если в
snd
из последних
[(Value,String)]
ничего не осталось, другие элементы в этом списке нигде не используются?
IЯ знаю альтернативный способ сделать это.Этот вопрос касается только понимания sepBy
вывода и его использования.