我正在学习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'
对我来说更方便阅读\写作。
我想在我的代码中使用#
函数而不是.
。 #
函数是否存在一些我看不到的问题?
答案 0 :(得分:6)
正如bheklir所说,#
&
来自lens
,这是反向应用。但是,反向组合是来自>>>
的{{1}}。