在下面的代码片段中,您可以看到我用 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]
如果有人能看一下并告诉我我做错了什么,我将不胜感激。
$
那么优先级较低:
(以及其他任何东西)所以你的函数解析为
(n : collatz') $ (n `div` 2)
这会导致您的类型错误。第二个参数:
需要一个列表,但您正在传递 collatz 函数。
如果您仍然想避免 3n+1 部分周围的括号,您可以执行以下操作
(n:) . collatz' $ n `div` 2
n : (collatz' $ n `div` 2)
尽管这些不一定比原来的更干净。如果您想知道,(n:)
第一个例子是一个语法糖\x -> n : x
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)