gpt4 book ai didi

haskell - 对 Haskell 的布局工具如何处理此代码感到困惑

转载 作者:行者123 更新时间:2023-12-03 08:49:41 26 4
gpt4 key购买 nike

浏览时https://wiki.haskell.org/IO_inside ,我遇到了下面的注释和代码...

"Moreover, Haskell layout rules allow us to use the following layout:

main = do a <- readLn
if (a>=0) then return ()
else do
print "a is negative"
...

that may be useful for escaping from the middle of a longish 'do' statement."



此后,我将使用符号 C* 来引用上面的代码。

我假设 C* 的目的是读入一个数字,然后:
(i) 如果它是非负的,什么也不做。
(ii) 如果它是负数,则显示输出说明它是负数。

我最初的 react 是认为 C* 要么无法正确解析,要么无法按预期运行。

我认为布局会在第二个“do”之后立即插入一组空的大括号和一个分号,因为词位“print”的缩进程度不超过“a”中的“a”建立的当前布局上下文的缩进级别 < - readLn”。

也就是说,我对 Layout 生成的布局不敏感代码(以下简称 C')的预测是这样的:
main = do {
a <- readLn;
if (a>=0) then return ()
else do {};
print "a is negative"
...
}

我认为会是这种情况,是基于 Haskell 2010 语言报告 ( https://www.haskell.org/onlinereport/haskell2010/haskellpa1.html) 第 1 部分第 2.7 节(“词汇结构”:“布局”)中包含的以下句子:

“如果紧跟 where、let、do 或 of 的非大括号词位的缩进小于或等于当前缩进级别,则插入一个空列表“{}”而不是开始布局,然后布局对当前级别进行处理(即插入分号或右大括号)。”

Haskell 2010 语言报告第 1 部分(上面给出的 URL)的第 10.3 节(“语法引用”:“布局”)给出了布局规则的更详细说明。

在阅读了这个更详细的说明后,我确信我对 Layout 生成的布局不敏感代码(即 C')的预测是正确的。

然而,令我惊讶的是,当我在 GHCi 中尝试上面规定的原始代码(即 C*)时,它可以正常工作(正确解析并按预期运行)。

问题 ...
  • 我上面引用的句子(来自第 2.7 节)是否准确?
  • 上面提到的布局规则的详细说明(来自第 10.3 节)是否准确?
  • 我用来预测由 Layout 为原始代码 C* 生成的布局不敏感代码(即 C')的推理中的缺陷是什么?
  • Layout 为上面规定的原始代码(即 C*)生成的布局不敏感代码是什么,解释它的规则/原则是什么?
  • 一般来说,有没有办法可以查看 Layout 生成的布局不敏感代码?如果是这样,它是什么(请在适合像我这样的 Haskell 新手的水平上详细说明/解释该技术)?
  • 最佳答案

    这是 known and documented deviation默认或 Haskell 98 模式中来自 Haskell 标准的 GHC。

    GHC 有一个名为 NondecreasingIndentation 的语言扩展。可用于触发此行为。如果启用,do即使下一个标记与周围 block 的缩进级别相同,关键字也会引入一个新 block 。

    如果您不想这样,请说 -XNoNondecreasingIndentation-XHaskell2010 (或相应地使用语言编译指示)。

    您可以通过传递 -ddump-parsed 查看 GHC 解析的代码的打印版本。标记到 GHC。这只会部分删除布局(它对 do-blocks 这样做,但例如不是 let),但仍可能提供线索。

    关于haskell - 对 Haskell 的布局工具如何处理此代码感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28322698/

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