collatz-list implementation using haskell
我尝试使用haskel实现collatz列表:这是我的代码:
1 2 3 4 5 6 7 8 9 10
| collatz n
| mod n 2 == 0 = div n 2
| otherwise = 3 * n + 1
collatzList n
| n < 1 = error"Cannot have negative number"
collatzList
| n == 1 = [n ]
| otherwise = n :collatzList (collatz n ) |
我收到的错误消息是:输入"collatzlist"时出现分析错误[第1页,共1页]编译主(练习hs,解释)失败,模块已加载:无。
有人能告诉我为什么要收到这个信息吗?
i get(使用不同的状态:7.4.1 GHC的)
1 2 3 4 5 6 7 8 9 10 11
| > :load"/tmp/C.hs"
[1 of 1] Compiling Main ( /tmp/C.hs, interpreted )
/tmp/C.hs:9:11: Not in scope: `n'
/tmp/C.hs:9:21: Not in scope: `n'
/tmp/C.hs:10:23: Not in scope: `n'
/tmp/C.hs:10:46: Not in scope: `n'
Failed, modules loaded: none. |
这是因为你忘了你的论点是在第二个ncollatzList方程。你可以添加这一论点。
1 2 3 4 5
| collatzList n
| n < 1 = error"Cannot have negative number"
collatzList n -- the n was missing here
| n == 1 = [n ]
| otherwise = n :collatzList (collatz n ) |
或者,因为左手边是现在你可以简单的连接是一样的,它与第一个:
1 2 3 4
| collatzList n
| n < 1 = error"Cannot have negative number"
| n == 1 = [n ]
| otherwise = n :collatzList (collatz n ) |
- 这仍然给了我同样的错误。它在你的系统中工作吗?
- @用户1462452:是的,这在GHC 7.4.1上编译得很好。鉴于您收到的错误信息,我建议您重新检查缩进。也许你把制表符和空格混在一起了,这样会导致"看不见"的语法错误。
你是redefining collatzList。
1 2 3
| collatzList
| n == 1 = [n ]
| otherwise = n :collatzList (collatz n ) |
这样做:
1 2 3 4 5 6 7 8
| collatz n
| mod n 2 == 0 = div n 2
| otherwise = 3 * n + 1
collatzList n
| n < 1 = error"Cannot have negative number"
| n == 1 = [n ]
| otherwise = n :collatzList (collatz n ) |
- 我试过了,我又犯了同样的错误
- @用户1462452:然后发布其余代码。这是您发布的代码中唯一的错误。
- @用户1462452 DreamCash是正确的。ideone.com/lqetyg网站
- 啊!这真的很奇怪。我有相同的代码,但它不起作用。@hammar:这是我的整个代码
- 你的意思是,即使你试图运行的代码与collatzList修复?
- @用户1462452这听起来可能很愚蠢,但您可能有一些问题,它的授权,只是复制过去的代码和编译。
- 是的,即使在修复它之后。@DreamCrash:我正在复制粘贴您提供的链接中的代码,但它仍然不起作用。但现在,它又给了我一个错误。
- @用户1462452是否正确编译?一号女巫?
- @DreamCrash,现在可以工作了。我得说,这是刚刚结束。当我第一次复制粘贴时,它不起作用。我又做了一次,现在开始工作了。
- 您可能在文件末尾隐藏了 ,复制时没有过度复制它们。
- 我有个简短的问题,最初我有和你们写的完全相同的代码,但它不是编译的。这与制表符和空格有关吗?如果是的话,那你怎么修复它呢?
- 让我们在聊天中继续讨论
生成列表的值只取决于这是在以前的值是一个典型的应用程序的功能(unfoldrData.List.unfoldr):
1 2 3 4 5 6
| import Data.List (unfoldr )
collatzList = unfoldr nextCollatz
where nextCollatz n | n <= 0 = Nothing
| n == 1 = Just (1, 0)
| even n = Just (n, n ` quot` 2)
| otherwise = Just (n, 3*n +1) |
unfoldr f x0需要从价值和功能fx0,适用于它。如果是Nothingf x0,算法terminates;如果它是Just (push, next)push,它添加到列表,和使用作为x0next新价值。另一个例子,使用unfoldr产生多达100平方:
1 2 3 4 5 6
| import Data.List (unfoldr )
squareList = unfoldr pow2
where pow2 n | n > 100 = Nothing
| otherwise = Just (n, 2*n )
--"Add n to the result list,
-- start next step at 2*n." |
(备注:在操作和error它通常更好的做一些虚拟函数返回值。在Collatz功能我上面的做法的结果是一个非营利的正整数而不是在空列表)的异常。