gpt4 book ai didi

Haskell:处理计算结果

转载 作者:行者123 更新时间:2023-12-02 16:03:38 24 4
gpt4 key购买 nike

我最近重新审视了 Haskell,并构建了一个玩具编程语言解析器/解释器。使用 Parsec 进行词法分析和解析以及单独的解释器。我在将解析器的结果提供给解释器并处理解释器和解析器的潜在错误时遇到了一些问题。我最终得到了这样的结果:

main = do
fname <- getArgs
input <- readFile (head fname)
case lparse (head fname) input of
Left msg -> putStrLn $ show msg
Right p -> case intrp p of
Left msg -> putStrLn $ show msg
Right r -> putStrLn $ show r

这看起来一点也不漂亮。我的问题是 lparse 返回 Either ParseError [(String, Stmt)]itrp 返回类型 Either ItrpError Stmt 因此,我很难将解析器的 Right 结果提供给解释器,同时保留并打印可能的 ParseErrorIntrpError .

最接近我想要的是这样的

main = do
fname <- getArgs
input <- readFile (head fname)
let prog = lparse (head fname) input
(putStrLn . show) (intrp <$> prog)

但这不会令人惊讶地产生一个嵌套的 Either 并且打印效果也不好。

那么,有没有什么好的 Haskell 理想方法可以将一个计算结果线程化到另一个计算结果,并以一种很好的方式处理错误(Lefts),而无需嵌套情况?

编辑

添加lparseitrp类型

lparse :: Text.Parsec.Pos.SourceName -> String -> Either Text.Parsec.Error.ParseError [([Char], Stmt)]

intrp :: [([Char], Stmt)] -> Either IntrpError Stmt

最佳答案

虽然并不完美,但我会创建一个辅助函数,用于将 Either 中的任何 Showable 错误嵌入到 MonadError 中。 :

{-# LANGUAGE FlexibleContexts #-}
import Control.Monad.Except

strErr :: (MonadError String m, Show e) => Either e a -> m a
strErr = either (throwError . show) return

然后,如果您的计算可能会因错误而失败,例如

someFn :: ExceptT String IO ()
someFn = strErr (Left 42)

您可以运行它(将错误打印到stdout):

main :: IO ()
main = runExceptT someFn >>= either putStrLn return

在你的情况下,它会是这样的

main = either putStrLn return <=< runExceptT $ do
fname <- liftIO getArgs
input <- liftIO $ readFile (head fname)
prog <- strErr $ lparse (head fname) input
r <- strErr $ interp prog
print r

关于Haskell:处理计算结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38960583/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com