Haskell:将ParseError a转换为a

时间:2017-11-16 20:38:57

标签: haskell

我实际上正在使用Parsec制作一个Expression Parser而且我有一个小问题(我的法语也很抱歉我的英语)。

我有这段代码:

data Expression ... -- Recursive type Expression

type Store [(String, Float)] -- variable's storage

type Parser a = Parsec String () a
parseExpr :: [Char] -> Either ParseError Expression
parseExpr string = parse expr "" stream 
    where 
        stream = filter (not . isSpace) string

-- Parser's rules ...

raiseError a = Nothing

evalParser :: [Char] -> Store -> Float
evalParser expr store = fromMaybe 0 (either raiseError (eval store)(parseExpr expr))

这段代码效果很好,但我需要这个功能:

parseExpression :: String -> Maybe Expression

我对使用正确的语法没有任何想法。

有人可以帮我吗?

1 个答案:

答案 0 :(得分:4)

我会为你开始,你可以完成它:

eitherToMaybe :: Either a b -> Maybe b
eitherToMaybe (Left a) = ???
eitherToMaybe (Right b) = ???

严重的过度概括看起来像这样(你可以在https://networkx.github.io/documentation/stable/reference/drawing.html#module-networkx.drawing.nx_agraph包中找到一个不那么直接实现的函数):

import Control.Applicative (Alternative (..))
import Data.Profunctor.Unsafe ((#.))
import Data.Monoid (Alt (..))

afold :: (Foldable f, Alternative g)
                      => f a -> g a
afold = getAlt . foldMap (Alt #. pure)

但你现在还不需要进入那个行业。