gpt4 book ai didi

haskell - 缩进操作符

转载 作者:行者123 更新时间:2023-12-02 13:37:18 25 4
gpt4 key购买 nike

hindent 将我的代码更改为:

do download i inputFile
onException
(callProcess (List.head args) (List.tail args))
(removeFileIfExists name)
`finally` removeFileIfExists inputFile

我无法确定 finally 是否适用于 do block 的其余部分,或者仅适用于 onException 开始的状态。根据this ,

If you see something unexpected in a list, like where, insert a closing brace before instead of a semicolon.

我不确定该规则是否适用于此。

`finally` 是否适用于 do 的其余部分,或者仅适用于最后一条语句?为什么?

最佳答案

我们可以使用 GHCi 来查找:写作

Prelude> let f = (>>)
Prelude> :{
Prelude| do print 5
Prelude| print 4
Prelude| `f` print 3
Prelude| print 2
Prelude| :}

导致以下类型错误(不是解析错误!)

<interactive>:12:8: error:
• Couldn't match expected type ‘(() -> IO ()) -> Integer -> IO b’
with actual type ‘IO ()’
• The function ‘print’ is applied to three arguments,
but its type ‘Integer -> IO ()’ has only one
In the second argument of ‘f’, namely ‘print 3 print 2’
In the expression:
do { print 5;
print 4 }
`f` print 3 print 2

查看列表行,我们发现 GHCi 是如何解析代码的,该代码是用明确的大括号和分号打印的。

在那里,我们看到 `f` 部分关闭do block !这使得整个 do block 成为 f 的第一个参数。此外,接下来的行不再位于 block 中,现在形成单个表达式 print 4 print 2,用作 f 的第二个参数。这会触发类型错误,因为它使用三个参数调用 print

确实,大括号 } 被插入在 `f` 之前,因为OP提到的规则:当 block 中的某些内容无法解析时,我们添加 } 并继续。

总结一下,如果 `f` 缩进 more,则该 block 将被解析为

do print 5
print 4 `f` print 3
print 2

如果`f`缩进前一行,或者,则该 block 将被解析为

(do { print 5
; print 4 }) `f` print 3 print 2

我建议避免像前一行一样缩进 `f`:最好少缩进,这样即使对于人类读者来说,解析也会变得显而易见。

关于haskell - 缩进操作符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48984756/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com