bet*_*x64 2 haskell types type-conversion
我对Haskell来说真的很棒.
我有这个代码:
4 sieve n i = if i < n
5 then
6 do {
7 innerSieve n;
8 sieve n (i + 1);
9 }
10 else -1
11
12 innerSieve n = return n
13
14 --innerSieve n i j = [x | x <- [i..n], x `mod` j == 0]
Run Code Online (Sandbox Code Playgroud)
我有这个错误:
[1 of 1] Compiling Main ( sieve.hs, interpreted )
Ok, modules loaded: Main.
*Main> sieve 10 2
<interactive>:1:1:
No instance for (Num (m0 b0))
arising from a use of `sieve'
Possible fix: add an instance declaration for (Num (m0 b0))
In the expression: sieve 10 2
In an equation for `it': it = sieve 10 2
*Main>
Run Code Online (Sandbox Code Playgroud)
我一直在撞墙试图理解它的意思是"没有实例(Num(m0 b0))." m0 b0在世界上是什么?
我认为这可能会有所帮助:
*Main> :t sieve
sieve :: (Ord a, Num a, Num (m b), Monad m) => a -> a -> m b
*Main>
Run Code Online (Sandbox Code Playgroud)
编辑:我试图通过基本上使用列表理解创建递归函数来重新创建erastothenes的筛子.我也想 - 理解代码中的所有内容.
你的内部do块有一个monadic类型.这使得整个结果sieve具有monadic类型(Monad m) => m b.语句的else分支if返回-1,因此我们知道它也有数字类型.这是您的功能的结果(Num (m b), Monad m) => m b.这显然是错误的.
我无法弄清楚你的功能想要完成什么,所以我不确定你到底出了什么问题.我建议在函数上编写显式类型注释,以准确表达您期望每个函数执行的操作.这将至少为您提供更好的错误消息,因为它不是说推断类型没有意义,而是指向您确切的表达式与显式类型不匹配.
顺便说一句,你可能会发现这if句话更好地表达为
sieve n i
| i < n = -- contents of the then block
| otherwise = -1
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
315 次 |
| 最近记录: |