2015-01-06 8 views
0

Я изучаю 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' удобнее для меня чтение \ сочинительство.

Я думаю использовать функцию # в моем коде вместо .. Существуют ли некоторые проблемы с функцией #, которую я еще не вижу?

+2

'lens' определяет этот оператор как' & 'с' infixl 1 & 'вместо этого, и я считаю, что F # использует' |> 'оператор или что-то подобное для подобного эффекта, но я на самом деле не использовал F # Я могу лгать. – bheklilr

+0

@bheklilr вы правы. – didierc

+3

Ваш оператор '(#)' перевернул функцию * приложение *, а не состав композиции. Вы можете рассмотреть разницу между 'f $ g $ h $ a' и' f. г . h $ a'. Некоторые авторы и языки предпочитают перевернутую композицию, кстати, это довольно разумная вещь, которую нужно хотеть. Вы можете определить '(>>>) = flip (.)' И использовать его как 'numEvens = filter even >>> length'. –

ответ

6

Ваш # является, как bheklir заметки, & из lens, что является обратным приложения. Reverse описание товара, однако >>> из Control.Category.

+0

О, беклир - это человек. :) –

+0

> Обратная композиция, однако, есть >>> из Control.Category. <Но ghci не видит функцию '>>>' в 'Control.Category' модуль: 'λ:: м + Control.Category λ:: т >>> : 1: 1: ошибка разбора на входе' >>>» λ::. Т Control.Category >> > : 1: 1: ошибка синтаксического анализа на входе 'Control.Category. >>> ' λ:' –

+1

Вам необходимо окружить операторы '()' ', чтобы использовать их неинфиксными способами:': t (>>>) 'будет работать нормально. – amalloy