haskell 中 '$' 能用在哪些地方呢?
用 '$' 可以省去很多的括号,可是下面的代码为什么是错误的呢?
threeAndOne :: Int -> [Int]
threeAndOne n | n < 1 = error "Number must bigger than 1."
| n == 1 = [1]
| even n = n : threeAndOne $ n `div` 2
| otherwise = n : threeAndOne $ 3 * n + 1
用括号的话,却是正确的。如下:
threeAndOne :: Int -> [Int]
threeAndOne n | n < 1 = error "Number must bigger than 1."
| n == 1 = [1]
| even n = n : threeAndOne (n `div` 2)
| otherwise = n : threeAndOne (3 * n + 1)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
原来一直认为使用 $ 等效为:
替换 '$' 为 '(',行尾再加一个 ')'
看来没这么简单!
还要考虑优先级
你说的还真对,
$ 就相当于是 apply,
不过 Haskell 中的 apply 运算符实际上就是空白,它的优先级是最高的。
$ 相当于优先级最低的 apply,而且是右结合的。
应该没有
如果有的话
apply 不同的函数,那它的类型是变化的
在 Haskell 中应该不存在这种函数。
原来如此!
再问一下:
$ 函数相当于 python 中的 apply 函数吗?(只是 $ 函数只支持一个参数的函数,并且是 infix)
haskell 有类似 apply 函数吗?
[ 本帖最后由 izhier 于 2009-4-12 09:07 编辑 ]
n : threeAndOne $ n `div` 2
就等于
(n : threeAndOne) $ (n `div` 2)
所以是错的。
n : threeAndOne (n `div` 2)
就等于
n : (threeAndOne (n `div` 2))
所以是对的。
Lisp 用户在这个问题上永远都有资格鄙视别人。
原来 $ 是一个函数
但是上面的还是不是太懂
可否讲一下:
threeAndOne 2
执行的流程
$ 是个函数(运算符),只不过优先级特低:
复制代码
[ 本帖最后由 flw 于 2009-4-11 17:45 编辑 ]
$ 是语法糖吗?
注意优先级就可以了。
冒号比 $ 的优先级高。
事实上 $ 的优先级最低。