Show
и Read
предназначены для создания и использования представления значения как выражения Haskell. Вот почему, когда вы вызываете show
на String
, он создает строку в кавычках :
> show "beans"
"\"beans\""
Поэтому Read
ожидает, что строка также будет заключена в кавычки, поэтому readMaybe
всегда возвращает Nothing
в вашем коде, потому что вы не предоставляете кавычки:
> readMaybe "beans" :: Maybe String
Nothing
> readMaybe "\"beans\"" :: Maybe String
Just "beans"
Поэтому исправление простое: удалите вызов readMaybe
и просто верните строку напрямую:
parseInput1 :: String -> Maybe String
parseInput1 input = if input == "stop"
then Nothing
else Just input
Что, в зависимости от предпочтения стиля, вы также можете писать с помощью охранников, сопоставления с образцом или монады Maybe
вместо if
:
parseInput2 input
| input == "stop" = Nothing
| otherwise = Just input
parseInput3 "stop" = Nothing
parseInput3 input = Just input
import Control.Monad (guard)
parseInput4 input = do
-- ‘guard’ returns ‘Nothing’,
-- short-circuiting the ‘do’ block,
-- if its condition is ‘False’.
guard (input /= "stop")
pure input
Read
и Show
подходят для простых программ, особенно когда вы изучаете Haskell, но в больших приложениях полезно использовать их в основном для отладки ввода и вывода и read
ввода, который вы уже подтверждено. Библиотеки синтаксического анализа и красивой печати предпочтительнее для более сложного синтаксического анализа и создания удобочитаемого вывода соответственно; megaparsec
и prettyprinter
- хорошие варианты по умолчанию в этой области.