Data.Array的//运营商优先级

egd*_*try 1 arrays haskell types

我注意到在以下示例中:

incrementByIndices :: Array Int Int -> [Int] -> Array Int Int
incrementByIndices arr indices = arr // zip indices (map (\i -> arr!i + 1) indices)
Run Code Online (Sandbox Code Playgroud)

zip不必被括号括起来.为什么会这样?:i (//)没有显示不同的优先级//所以我认为它是常规功能应用程序.为什么我没有类型检查错误说明zip不能成为//争论?

与之相反:

nub nub [1,2,3]
Run Code Online (Sandbox Code Playgroud)

yat*_*975 11

函数应用程序绑定比任何运算符都紧,所以你的表达式不需要括号,原因与之相同,例如,这个不是:

zip [1,2,3,4] [5,6,7,8] ++ zip [20,30] [30,40]
Run Code Online (Sandbox Code Playgroud)

优先级和固定性(//)在这里根本不重要!

  • @egdmitry基本上,虽然你可以转换.`++`是一个操作符,默认是一个操作符,`zip`是一个标识符,但`(++)`可以用作一个标识符(你甚至可以让'let(++)= 2 in (++)+(++)`)和`\`zip \``是一个运算符.参见[Haskell报告](https://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-240003.2). (2认同)