【发布时间】:2011-12-04 21:15:23
【问题描述】:
在下面的 sn-p 中,你可以看到我在 Haskell 中编写的两个 collatz 函数。对于递归应用程序,我在第一个示例 (collatz) 中使用了括号来获得正确的优先级。
因为我刚刚学习了 $ 的函数应用程序,所以我尝试使用那个东西重写函数 (collatz')。但是,我遇到以下错误:
无法匹配预期类型“[a]” 针对推断类型 `a1 -> [a1]' 在 `(:)' 的第二个参数中,即 `collatz'' 在 `($)' 的第一个参数中,即 `n : collatz'' 在表达式中: n : collatz' $ n `div` 2
collatz :: (Integral a) => a -> [a]
collatz 1 = [1]
collatz n | even n = n : collatz (n `div` 2)
| otherwise = n : collatz (n * 3 + 1)
collatz' :: (Integral a) => a -> [a]
collatz' 1 = [1]
collatz' n | even n = n : collatz' $ n `div` 2
| otherwise = n : collatz' $ n * 3 + 1
这对我来说很奇怪,这不起作用。所以我尝试了一个类似的例子:
True : [even $ 3 `div` 3]
如果有人可以看看它并告诉我我做错了什么,我将不胜感激。
【问题讨论】:
-
主题评论:让 collatz 函数只计算下一步(所以
collatz :: Integral => a -> a)然后使用类似takeWhile (/= 1) . iterate的东西在单独的步骤中构建列表可能是更简洁的代码跨度> -
虽然
$有时可以消除括号,但并非总是如此,有时使用括号更简洁。