Я изучаю 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'
удобнее для меня чтение \ сочинительство.
Я думаю использовать функцию #
в моем коде вместо .
. Существуют ли некоторые проблемы с функцией #
, которую я еще не вижу?
'lens' определяет этот оператор как' & 'с' infixl 1 & 'вместо этого, и я считаю, что F # использует' |> 'оператор или что-то подобное для подобного эффекта, но я на самом деле не использовал F # Я могу лгать. – bheklilr
@bheklilr вы правы. – didierc
Ваш оператор '(#)' перевернул функцию * приложение *, а не состав композиции. Вы можете рассмотреть разницу между 'f $ g $ h $ a' и' f. г . h $ a'. Некоторые авторы и языки предпочитают перевернутую композицию, кстати, это довольно разумная вещь, которую нужно хотеть. Вы можете определить '(>>>) = flip (.)' И использовать его как 'numEvens = filter even >>> length'. –