Haskell>.> Нотация - PullRequest
       30

Haskell>.> Нотация

4 голосов
/ 28 декабря 2011

В книге «Создание функции программирования» символ «>.>» Объединяет функции, противоположные направлению «.»Но когда я реализовал это с помощью ghci, он показывает ошибку «>.>» Вне области видимости.Зачем?Это старая нотация, которая больше не используется?

Ответы [ 3 ]

7 голосов
/ 28 декабря 2011

>.> не определено по умолчанию, но вы можете определить его самостоятельно:

infixl 9  >.>
(>.>) = flip (.)

или эквивалентно

infixl 9  >.>
f >.> g = g . f

(Я дал декларацию исправления на основе infixr 9 . в Prelude .)

6 голосов
/ 28 декабря 2011

Это, вероятно, просто функция, определенная книгой (я не читал книгу). AFAIK, >.> нигде не используется. Вы можете определить это сами:

(>.>) = flip (.)

Де-факто это выглядит как (#).

Поскольку функциями являются стрелки "Control.Category" , вы также можете использовать >>>, например,

Prelude Control.Category> ((*2) . (+1)) 4
10
Prelude Control.Category> ((*2) <<< (+1)) 4
10
Prelude Control.Category> ((*2) >>> (+1)) 4
9
Prelude Control.Category> ((+1) >>> (*2)) 4
10
3 голосов
/ 28 декабря 2011

(>.>) не определяется в стандартных библиотеках.Однако есть (>>>) в Control.Category, который ведет себя так же:

Prelude> :m + Control.Category
Prelude Control.Category> :i (>>>)
(>>>) :: Category cat => cat a b -> cat b c -> cat a c
    -- Defined in Control.Category
infixr 1 >>>
Prelude Control.Category> let f = (* 2) >>> (+ 3)
Prelude Control.Category> f 5
13

Обратите внимание, что вы можете использовать Hoogle , чтобы понять эти вещи.

Кроме того, вы, конечно, всегда можете определить такой оператор самостоятельно:

(>.>) :: (a -> b) -> (b -> c) -> (a -> c)
f >.> g = g . f

Тогда вы можете написать:

Main*> ((* 2) >.> (+ 3)) 5
13
...