4

在“函数编程的工艺”一书中,符号“>.>”将函数连接在一起,与“.”的方向相反。但是当我使用 ghci 实现它时,它显示错误 '>.>' 超出范围。为什么?它是不再使用的旧符号吗?

4

3 回答 3

7

>.>默认情况下未定义,但您可以自己定义:

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

或等效地,

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

(我根据Preludeinfixr 9 .中的给出了固定性声明。)

于 2011-12-28T11:14:58.350 回答
6

它可能只是书上定义的一个函数(我没看过书)。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
于 2011-12-28T11:16:12.687 回答
3

(>.>)似乎没有在标准库中定义。但是,有(>>>)in 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
于 2011-12-28T11:19:07.927 回答