gpt4 book ai didi

python - Haskell 中的缩进和 Python 中的一样吗?

转载 作者:太空宇宙 更新时间:2023-11-03 12:18:27 25 4
gpt4 key购买 nike

我刚开始学习 Haskell,我简要阅读了一些缩进规则,在我看来,Haskell 在缩进方面的表现就像 Python(我可能是错的)。无论如何,我尝试编写一个尾递归斐波那契函数,但我一直收到缩进错误,我不知道我的代码在哪里缩进了错误。

错误信息:

F1.hs:6:9: error:
parse error (possibly incorrect indentation or mismatched brackets)
|
6 | |n<=1 = b | ^

代码:

fib :: Integer -> Integer
fib n = fib_help n 0 1
where fib_help n a b
|n<=1 = b
|otherwise fib_help (n-1) b (a+b)

注意:我在 Notepad++ 中编写代码,并且更改了设置,以便在我 TAB 时创建 4 个空格而不是制表符(我猜应该是这样)

最佳答案

不,Haskell 的缩进不像 Python。

Haskell 与缩进级别无关,它是关于使事物与其他事物对齐。

    where fib_help n a b

在这个例子中你有where,下面的标记不是{。这会激活布局模式(即空白敏感解析)。下一个标记 (fib_help) 设置以下 block 的起始列:

    where fib_help n a b
-- ^
-- | this is "column 0" for the current block

下一行是:

        |n<=1 = b

第一个标记 (|) 的缩进小于“第 0 列”,这隐式地关闭了 block 。

你的代码就像你写的一样被解析

fib n = fib_help n 0 1
where { fib_help n a b }

|n<=1 = b
|otherwise fib_help (n-1) b (a+b)

这是几个语法错误:where block 缺少 =,并且您不能使用 | 开始新的声明。

解决方案:缩进所有应该属于 where block 的部分,而不是 where 之后的第一个标记。例如:

fib n = fib_help n 0 1
where fib_help n a b
|n<=1 = b
|otherwise = fib_help (n-1) b (a+b)

或者:

fib n = fib_help n 0 1
where
fib_help n a b
|n<=1 = b
|otherwise = fib_help (n-1) b (a+b)

或者:

fib n = fib_help n 0 1 where
fib_help n a b
|n<=1 = b
|otherwise = fib_help (n-1) b (a+b)

关于python - Haskell 中的缩进和 Python 中的一样吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46002881/

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