New*_*der 1 haskell pattern-guards
我开始编写Haskell代码.我试图用卫兵写一个斐波纳契函数 -
fibo :: (Num z, Ord z) => z -> z
fibo d
| d <= 0 = 0
| d == 1 = 1
| otherwise = fibo (d-1) + fibo (d-2)
Run Code Online (Sandbox Code Playgroud)
我收到了这个错误: -
非法类型签名:'(Num z,Ord z)=> z - > z fibo d'也许您打算在模式类型签名中使用ScopedTypeVariables
然而另一个功能 - 复制我用类似的方式编写,编译和工作正常.我可以用另一种方式写斐波纳契,但我想知道错误是什么
你的程序中的缩进是错误的,StackOverflow对选项卡的奇怪处理使得你的问题中的缩进以不同的方式出错.
你的程序应该缩进这样:
fibo :: (Num z, Ord z) => z -> z
fibo d
| d <= 0 = 0
| ...
Run Code Online (Sandbox Code Playgroud)
前两行应该在同一列中开始,带有防护的行应该比那些行更加缩进.
问题中显示的程序错误的方式与您提到的错误不同:带有防护的线条必须比前面的线条更加缩进.发生这种情况是因为StackOverflow对制表符进行了非标准处理.不要使用标签.
您的错误与GHC查看您的程序一致,如下所示缩进:
fibo :: (Num z, Ord z) => z -> z
fibo d -- wrong, must start in same column as previous line
| d <= 0 = 0
| ...
Run Code Online (Sandbox Code Playgroud)
我们可以重建你的原始程序一定是
<sp><sp><sp><sp>fibo :: (Num z, Ord z) => z -> z
<tab> fibo d
<tab> | d <= 0 = 0
<tab> | ...
Run Code Online (Sandbox Code Playgroud)
不要使用标签.