2015-02-17 1 views
0

Я изучаю Haskell с LYAH учебник. Я нахожусь в Walk the line разделе. Он представил очень полезный оператор:Каррирование цепочки функций, связанных -:

x -: f = f x 

Это позволяет принимать начальные государственные и цепные функции с этим оператором:

(0,0) -: landLeft 1 -: landRight 4 -: landLeft (-1) -: landRight (-2) 

Мой вопрос, как я мог бы взять эту цепочку функций и дать ему отдельное имя? Например:

chain = landLeft 1 -: landRight 4 -: landLeft (-1) -: landRight (-2) 
(0,0) -: chain 
+0

'chain x = x landLeft 1 -: landRight 4 ...'? – Lee

ответ

4

Вы могли бы дать явное рассуждение

chain x = x -: landLeft 1 -: landRight 4 -: landLeft (-1) -: landRight (-2) 

Этот оператор не очень способствует цепочки операций сами по себе, это действительно просто flip ($), и, как мы знаем, вы не можете сделать что-то вроде chain = h $ g $ f, чтобы заменить h $ g $ f $ x. Вместо этого принято заменять на $., как в chain = h . g . f. Если вы хотите использовать левую направо стиль вместо этого, я бы рекомендовал сделать отдельный оператор, чтобы быть эквивалентом flip (.):

(-:) = flip ($) 
(-.) = flip (.) 

chain = landLeft 1 -. landRight 4 -. landLeft (-1) -. landRight (-2) 

Или вы могли бы использовать операторы из Control.Arrow вместе с оператором -::

import Control.Arrow 

chain = landLeft 1 >>> landRight 4 >>> landLeft (-1) >>> landRight (-2) 

> x -: chain 

на самом деле, учитывая оператор в Control.Arrow, вы можете определить landLeft и landRight:

landLeft c = first (+c) 
landRight c = second (+c) 
landBoth c = (+c) *** (+c) 
3

Нет, вы не можете. Причина в том, что

chain = x -: y -: z 

означает

chain = z (y x) 

Итак, когда вы подаете заявление w -: chain, вы получите

w -: chain = z (y x) w 

, который, по существу, мусор, и, вероятно, тип проверки будет жаловаться. Вы вместо этого хотите иметь

w -: chain = z (y (x w))) 

Что вы можете сделать, это определение цепи с помощью оператора композиции (.).

chain = z . y . x 

Обратите внимание, что порядок напротив к тому, вы имели в -:. Для изменения порядка, можно использовать вместо

import Control.Arrow (>>>) 
chain = x >>> y >>> z 

 Смежные вопросы

  • Нет связанных вопросов^_^