对于以下Haskell表达式
返回>> = f
是否应该被理解为
(返回a)>> = f
或
返回(a>> = f)?
这里的相关规则是什么?
答案 0 :(得分:12)
规则总是函数应用程序的优先级高于任何运算符,所以
return a >>= f
被解析为
(return a) >>= f
无论使用哪种功能或运算符代替return
,f
和>>=
。
这意味着像
divide :: Int -> Int -> Double
divide x y = (fromIntegral x) / (fromIntegral y)
等同于
divide :: Int -> Int -> Double
divide x y = fromIntegral x / fromIntegral y
另一个更有用的例子是功能组合:
something :: [Int] -> [Int]
something xs = filter even . map (+1) . zipWith (*) [1..] . take 200 . cycle $ xs
正如你在这里看到的,我们甚至让zipWith
采用由其他几个函数组成的两个参数。这相当于在组合的每个组成部分周围加上括号。