从左到右的函数组合
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
.
我正在学习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
.