【发布时间】:2012-03-14 06:57:09
【问题描述】:
我是 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]
我有这个错误:
[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>
我一直在用头撞墙,试图理解“No instance for (Num (m0 b0))”是什么意思。 m0 b0 到底是什么?
我认为这可能会有所帮助:
*Main> :t sieve
sieve :: (Ord a, Num a, Num (m b), Monad m) => a -> a -> m b
*Main>
编辑: 基本上,我正在尝试通过使用列表理解创建递归函数来重新创建erastothenes 的筛子。我还想 - 理解 - 代码中的所有内容。
【问题讨论】:
-
起初。在
then(do ...) 和else(-1) 之后的if ... then do ... else -1表达式有不同的类型。do ...具有一元类型 (m b)。-1的类型实现了Num类型类(换句话说,它只是一个数字)。你的代码应该做什么? -
不清楚您要做什么...为什么 sieve monadic ?您打算将其用于什么单子?至于错误,这意味着您的 if 的两个分支都不兼容: then 导致“sieve n (i+1)”必须是单子的,因为它是 do-block 的最后一个元素,所以说类型为“Monad” m => ma" 和 else 导致 "-1" 这显然是一个数字。数字字面量在 Haskell 中是多态的,这里编译器尝试将“-1”转换为“ma”类型并发现它不知道如何做到这一点(它只知道 Num 实例,即 Int、Integer、Float ...)。
-
您是否尝试复制您注释掉的列表理解的行为?
-
你想让
sieve拥有什么类型? -
您试图在不理解语言的情况下进行命令式编写。 Haskell 是一种与您可能习惯的语言完全不同的语言。理解需要一些时间,但您必须首先忘记有关命令式语言的所有内容。
标签: haskell types type-conversion