gpt4 book ai didi

purescript - 如何使用纯脚本 Aff 编写防御程序

转载 作者:行者123 更新时间:2023-12-05 05:17:18 24 4
gpt4 key购买 nike

我是纯脚本的新手,我正在试验效果和特定的异步效果。

我最喜欢 FP 和严格的编译器(如 purescript 所拥有的)的一件事是它强制您处理所有可能的结果,尤其是当您定义某些事情可能会失败时。例如,如果您正在使用 Either,您需要告诉程序在您有正确答案或错误时该怎么做。

当我第一次看到效果时,我喜欢 actionshandlers 的概念,如果你的代码的一部分需要抛出异常(我想这是你想使用的最后一个资源)你需要使用类似

的东西来声明它
someAction :: forall eff. Eff (exception :: EXCEPTION | eff)

并且您可以定义一个处理程序来消除该影响,这样您就知道从那时起您就不必关心异常了。

但是在使用 Aff monad 和 purescript-node-fs-aff 库进行一些基本测试时,我得到了一些意想不到的结果。

如果我这样做

main :: forall e. Eff (console :: CONSOLE, buffer :: BUFFER, fs :: FS | e) Unit
main = do
_ <- launchAff $ readAndLog "./non-existing-file"
pure unit

readAndLog :: forall eff. String -> Aff (fs :: FS, console :: CONSOLE | eff) Unit
readAndLog path = do
str <- readTextFile UTF8 path
log str

如果文件不存在,程序将终止并抛出异常,并且没有任何信息告诉我这段代码可能会失败,并且我应该尝试保护我的程序以防止失败。

我实际上可以更加防御并使用 catchError,但我预计至少编译器会失败,说我没有将异常视为可能的副作用。

main :: forall e. Eff (console :: CONSOLE, buffer :: BUFFER, fs :: FS | e) Unit
main = do
_ <- launchAff $ readAndLog "./non-existing-file" `catchError` (\e -> log ("buu: " <> message e))
pure unit

readAndLog :: forall eff. String -> Aff (fs :: FS, console :: CONSOLE | eff) Unit
readAndLog path = do
str <- readTextFile UTF8 path
log str

理想情况下,我想做类似Either 的事情,并负责处理操作可能出现的特定错误。例如,当我读取一个文件时,我应该会遇到类似 ENOENT(文件不存在)或 EACCES(您无权访问)等错误。如果我想忽略特定原因,只记录它失败,这是我的选择,但类型系统应该强制我处理它。

最佳答案

您的问题有多个方面。

首先,效果行很快就会从标准做法中删除。从v0.12开始.这是 a public opinion poll就此事。讨论在 GitHub 上。简而言之:负担大于 yield 。

然后是知道可以抛出哪些异常的问题。如果你在任何地方使用 3rd 方 JavaScript,那将很困难。在这种情况下,我建议将已知异常视为可能抛出的所有异常的下限。换句话说,即使您捕获了所有已知的异常,您也必须进行默认捕获以解决未知的问题。

看看 Nathan Faubion 的 purescript-checked-exceptions图书馆。这显示了如何将已检查的异常应用于 ExceptT 接口(interface)。

我对适用于 FFI 的 JavaScript native 异常进行了类似的工作。不幸的是,这还没有发布,但我希望能够尽快发布。至少你知道这是可能的。

最后一个方面是 Aff 本身。不幸的是,Aff 并不是为任意异常而设计的。它只支持 Error 类型(即同名的 JavaScript 类型)。因此,您最好使用带有 Aff 的 purescript-checked-exceptions 来添加检查异常。

关于purescript - 如何使用纯脚本 Aff 编写防御程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49410290/

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