开始写Haskell代码。我试着用守卫写一个斐波那契函数-
fibo :: (Num z, Ord z) => z -> z
fibo d
| d <= 0 = 0
| d == 1 = 1
| otherwise = fibo (d-1) + fibo (d-2)
我得到了这个错误:-
非法类型签名:' (Num z, Ord z) => z -> z fibo d '也许您打算使用ScopedTypeVariables在模式类型签名
中然而,另一个函数-复制我以类似的方式编写,编译和工作良好。我可以用另一种方式写fibonacci,但我想知道错误是什么
你的程序中的缩进是错误的,StackOverflow对制表符的奇怪处理使你的问题中的缩进以不同的方式错误。
-
你的程序应该像这样缩进:
fibo :: (Num z, Ord z) => z -> z fibo d | d <= 0 = 0 | ...
前两行应该在同一列中开始,并且带保护符的行应该比这些行更缩进。 在你的问题中显示的程序是错误的,与你提到的错误不同:带保护符的行必须比前面的行更缩进。这是因为StackOverflow对制表符的处理不标准。
您的错误与GHC将您的程序视为缩进的方式一致:
fibo :: (Num z, Ord z) => z -> z fibo d -- wrong, must start in same column as previous line | d <= 0 = 0 | ...
我们可以重构出你的原始程序一定是
<sp><sp><sp><sp>fibo :: (Num z, Ord z) => z -> z <tab> fibo d <tab> | d <= 0 = 0 <tab> | ...