从左到右的函数组合

Function composition left to right

我正在学习Haskell。一些表达:

replicate 2 . product . map (*3) $ zipWith max [1,2] [4,5]

构建时我先写zipWith max [1,2] [4,5],然后按Home键,写map (*3) $,然后再按Home键并写入 product .,然后我按下 Home 键并写入 replicate 2 .。这种方式对我来说很不方便。

所以我从右到左构建一个表达式,当我阅读这篇文章时 - 我也是从右到左构建的。但我习惯了从左到右阅读 - 这对我来说更方便。

我可以从左到右做同样的事情:

zipWith max [1,2] [4,5] # map (*3) # product # replicate 2

在这种情况下,我是 writting\reading 一个从左到右的表达式,因为我习惯了,没有按下 Home 键。

我将 # 函数定义为:

infixl 0 #
(#) :: a -> (a -> b) -> b
n # f = (f) n

因此,# 函数创建了 函数组合 ,就像 . 函数一样,但它是从左到右工作的。

例如,这个函数是等价的:

someFunc :: (Double -> Double) -> Double -> Int
someFunc f n = length . takeWhile (< n) $ scanl1 (+) (map (f) [1..])

someFunc' :: (Double -> Double) -> Double -> Int
someFunc' f n = map (f) [1..] # scanl1 (+) # takeWhile (< n) # length

但是 someFunc' 对我来说 reading\writting 更方便。

我正在考虑在我的代码中使用 # 函数而不是 .# 函数是否存在一些我还没有看到的问题?

您的 # 是,正如 bheklir 指出的那样,& 来自 lens,这是反向 应用程序 。然而,反向 组合 >>> 来自 Control.Category.