功能组成从左到右

时间:2015-01-06 21:17:50

标签: haskell

我正在学习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

这个案例我正在写一个从左到右阅读表达式,因为我习惯了,没有按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'对我来说更方便阅读\写作。

我想在我的代码中使用#函数而不是.#函数是否存在一些我看不到的问题?

1 个答案:

答案 0 :(得分:6)

正如bheklir所说,# &来自lens,这是反向应用。但是,反向组合是来自>>>的{​​{1}}。