Я видел этот вопрос на SO и пытаюсь его воспроизвести: json">Haskell: повторное использование экземпляров FromJSON с линзами, линзами-эзонами и вложенными JSON
Однако, когда я запускаю то, что, по моему мнению, должно быть полным примером, я получаю сообщение об ошибке.
Вот мой код:
import Data.Aeson
import Data.Aeson.Lens
import Control.Lens
import Data.Aeson.Types
data Colour = Yellow | Green | Blue
instance FromJSON Colour where
parseJSON (String s) = return $ case s of
"blue" -> Blue
"green" -> Green
_ -> Yellow
parseJSON _ = mzero
instance ToJSON Colour where
toJSON Yellow = String "yellow"
toJSON Blue = String "blue"
toJSON Green = String "green"
parseColour :: String -> Maybe Colour
parseColour j = j ^? key "info" . key "colour" . _JSON
parseColour "{ \"info\": { \"colour\": \"yellow\" } }"
Я получаю это:
<interactive>:7:17: error: Variable not in scope: mzero :: Parser Colour
Многие поиски показывают успешное использование переменной mzero. Я не могу сказать, это что-то импортированное из пакета или просто произвольное имя переменной, и я неправильно использую функцию. В любом случае, мне непонятно, почему копирование этого кода из вопроса, похоже, не удается.
mzero
происходит из класса типовMonadPlus
вControl.Monad
. - person chepner   schedule 12.04.2019