如何处理弗雷格的异常?

时间:2015-10-05 23:19:33

标签: frege

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

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

但我不清楚如何使用UInt32表达式。

问题

我想读取一个文件并返回其所有行。如果它不存在,我可能想要返回一个空列表。类似的东西:

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) 中的更多示例会有很多帮助。

由于

1 个答案:

答案 0 :(得分:2)

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

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

_.foo   

是一个可以去除的术语

\it -> it.foo

还可以应用额外的参数:

_.foo bar baz

变得黯然失色

\it -> it.foo bar baz

这完全适用于上述情况。

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

你说对弗雷格善良来说这是一个很好的问题。但是,github repo中也有一些工作示例。对于这种情况,请查看examples / SimpleIO.fr