尝试处理异常时,我发现了一个相关的问题:

what is the Frege equivalent to Haskell's "interact" function?

但是我不清楚如何使用 try/catch/finally 表达式。

问题 :

我想读取一个文件并返回它的所有行。如果它不存在,我可能想返回一个空列表。就像是:

getContent :: String -> IO [String]
getContent filePath = openReader filePath >>= \reader -> reader.getLines
    `catch` (\(e::FileNotFoundException) -> return [])
    `finally` (println "something went wrong")

前面的代码可以编译,但在执行时只显示以下内容:
frege> getContent "asdf"

java.io.FileNotFoundException: asdf (No such file or directory)

问题:
  • 我应该如何更改我的代码以按预期运行(在引发异常时返回一个空列表)?
  • 文档中有没有与此相关的地方?我相信 docs/wiki/frege goodness 中的更多示例会有很大帮助。

  • 谢谢

    最佳答案

    到目前为止,代码看起来不错,但是 lambda 存在问题。就像在 Haskell 中一样,lambda 在语法上尽可能地扩展。因此,尽管 catch 的优先级低于 >>=,但它仍然属于 lambda。

    顺便说一下,这种 lambda 表达式有一个简写形式:

    _.foo
    

    是一个脱糖的术语
    \it -> it.foo
    

    也可以应用额外的参数:
    _.foo bar baz
    

    脱糖
    \it -> it.foo bar baz
    

    这完全适用于上述情况。

    在 REPL 中,您可以使用 :help 命令获取有关 catch、finally 和 >>= 的文档。

    你说得对,这对 Frege Goodness 来说是个好问题。但是,github 存储库中也有工作示例。对于这种情况,请查看 examples/SimpleIO.fr

    关于frege - 如何处理 Frege 中的异常?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32959378/

    10-13 22:31