[haskell]函数复合有点模糊

发布于 2022-09-01 20:18:20 字数 591 浏览 14 评论 9

本帖最后由 retuor 于 2010-07-17 15:07 编辑

Prelude> length.reverse [1,2,3]

<interactive>:1:7:
    Couldn't match expected type `a -> [a1]'
           against inferred type `[t]'
    In the second argument of `(.)', namely `reverse [1, 2, 3]'
    In the expression: length . reverse [1, 2, 3]
    In the definition of `it': it = length . reverse [1, 2, 3]

Prelude> length.reverse $ [1,2,3]
3

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

软糖 2022-09-10 15:13:00

原来这个叫函数复合 ……

感受沵的脚步 2022-09-10 15:12:32

洁癖都用$
length $ reverse $ [1,2,3]

终陌 2022-09-10 15:11:27

(((.) length) reverse) [1,2,3],呵呵.

打字洁癖症患者是怎么样的,能治么?

苦笑流年记忆 2022-09-10 15:10:13

函数应用的优先级最高

length . reverse [1,2,3] 等同于 length . ( reverse [1,2,3] )
而 (.) length reverse [1,2,3] 等同于 ( (.) length  reverse ) [1,2,3]

注意函数应用是左结合的。

江南月 2022-09-10 15:04:25

试了下

  1. Prelude> 1 + 2 * 3
  2. 7
  3. Prelude> (+) 1 2 * 3
  4. 9

复制代码我想应该就是这么回事。。。   加了()之后的运算符就成了真正的函数。
运算符和函数有细微的区别,  至少运算符都有  infixr xxoo 或者 infixl xxoo这个属性

孤城病女 2022-09-10 14:05:32

本帖最后由 SNYH 于 2010-07-17 22:46 编辑

函数的优先级比  (.)运算符  要高
所以 reverse 会先应用到 [1,2,3] 上

但写成 (.) length reverse 的时候 . 就是一个函数 而不是运算符了

纯猜想
ps: 函数是left-associative

.  infixr 9

我没找到函数的优先级是多少之找到这句话

Whereas normal function application (putting a space between two things) has a really high precedence,....

十年九夏 2022-09-10 11:45:55

但 (.) length reverse [1,2,3] 的时候,是按 (length . reverse) [1,2,3] 来算的。放前面和放中间优先级不一样吗?

っ〆星空下的拥抱 2022-09-10 09:29:29

因为 优先级
  这个在所有的语言里面貌似都是通用的吧

一般是这样写的 length . reverse $ [1,2,3]

ㄖ落Θ余辉 2022-09-09 17:29:12

为什么 (.) length reverse [1,2,3] 可以,而 length . reverse [1,2,3] 时,haskell 会把整个 reverse [1,2,3] 作为第二个参数呢?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文