我实际上正在使用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
我对使用正确的语法没有任何想法。
有人可以帮我吗?
答案 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)
但你现在还不需要进入那个行业。