【问题标题】:How to handle exceptions in Frege?如何处理弗雷格中的异常?
【发布时间】:2015-10-07 00:19:23
【问题描述】:

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

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 表达式更改为 _.getLines 即可:-)

标签: frege


【解决方案1】:

到目前为止,代码看起来不错,但是 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 repo 中也有一些工作示例。对于这种情况,请查看examples/SimpleIO.fr

【讨论】:

    猜你喜欢
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多