gpt4 book ai didi

haskell - EitherT 的惯用用法和错误

转载 作者:行者123 更新时间:2023-12-04 02:46:15 25 4
gpt4 key购买 nike

我已经编写了以下代码来替换我从 readFile 获得的错误消息:

module Main where

import Control.Error
import qualified Data.ByteString.Lazy as BSL

replaceLeftT :: Monad m => String -> EitherT String m a -> EitherT String m a
replaceLeftT message e = EitherT $ do
unwrapped <- runEitherT e
let x = case unwrapped of
Left _ -> Left message
y -> y
return x

main :: IO ()
main = runScript $ do
contents <- replaceLeftT "Could not read file" $
scriptIO $ BSL.readFile "somefile"
scriptIO $ putStrLn "Won't get here"

我觉得它很笨拙,就像我缺少一个基本概念一样。可能是因为我主要通过反复试验得出这个函数......

对于使用现有 Control.Error 原语或一般的 monad 原语来执行此操作的方法有何建议?

最佳答案

有不同的方法可以实现:

  1. 使用 hushTnoteT

    您可以通过先将其丢弃 (hushT) 然后添加新的 (noteT) 来覆盖错误消息。

    replaceLeftT :: Monad m => String -> EitherT String m a -> EitherT String m a
    replaceLeftT message = noteT message . hushT
    -- Same as: replaceLeftT message e = noteT message $ hushT e
  2. 使用 fmapLT

    另一种可能性是使用fmapLT 修改Left 中的消息。为了实现 replaceLeftT,我们总是返回相同的新值,忽略旧值:

    replaceLeftT :: Monad m => String -> EitherT String m a -> EitherT String m a
    replaceLeftT = fmapLT . const
    -- Same as: replaceLeftT message e = fmapLT (const message) e

关于haskell - EitherT 的惯用用法和错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18807206/

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