首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理Frege中的异常?

如何处理Frege中的异常?
EN

Stack Overflow用户
提问于 2015-10-05 23:19:32
回答 1查看 116关注 0票数 3

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

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

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

问题

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

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

前面的代码编译,但执行时只显示以下内容:

代码语言:javascript
复制
frege> getContent "asdf"

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

问题:

  • 我应该如何更改代码以按预期操作(在引发异常时返回空列表)?
  • 与此相关的文档中有什么地方吗?我相信docs/wiki/frege goodness中更多的例子会有很大帮助。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-06 06:28:24

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

顺便说一句,这类lambda表达式有一个简短的表单:

代码语言:javascript
复制
_.foo   

是一个词

代码语言:javascript
复制
\it -> it.foo

此外,还可以应用额外的参数:

代码语言:javascript
复制
_.foo bar baz

降至

代码语言:javascript
复制
\it -> it.foo bar baz

这正是上述情况下所做的。

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

你说得对,这对弗雷格善良来说是个好问题。然而,在github回购中也有一些有用的例子。对于本例,请查看示例/SimpleIO.fr

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32959378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档