如何处理 Frege 中的异常?
How to handle exceptions in Frege?
在尝试处理异常时我发现了一个相关的问题:
what is the Frege equivalent to Haskell's "interact" function?
但我不清楚如何使用 try/catch/finally
表达式。
问题:
我想读取一个文件和 return 它的所有行。如果它不存在,我可能想要 return 一个空列表。类似于:
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)
问题:
- 我应该如何更改我的代码以按预期运行(在引发异常时 return 一个空列表)?
- 文档中有没有与此相关的地方?我相信
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
在尝试处理异常时我发现了一个相关的问题:
what is the Frege equivalent to Haskell's "interact" function?
但我不清楚如何使用 try/catch/finally
表达式。
问题:
我想读取一个文件和 return 它的所有行。如果它不存在,我可能想要 return 一个空列表。类似于:
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)
问题:
- 我应该如何更改我的代码以按预期运行(在引发异常时 return 一个空列表)?
- 文档中有没有与此相关的地方?我相信
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