Haskell >.> 符号的含义是什么?

4
在书籍《函数式编程的艺术》中,符号 '>.>' 用于将函数组合起来,方向与 '.' 相反。但是当我在 ghci 中实现时,出现了“>.>”未定义的错误。这是为什么?它是一种已经不再使用的旧符号吗?
3个回答

7

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

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

或者等价地说,
infixl 9  >.>
f >.> g = g . f

我基于在预设库infixr 9 .声明修复。

也可以直接写成:(f >.> g) x = g (f x) 或者 (>.>) f g x = g (f x) - Dan Burton

6

这很可能只是书中定义的一个函数(我没有读这本书)。据我所知,在任何地方都没有使用>.>。你可以自己定义它:

(>.>) = 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

感谢您提供这个简单明了的答案。但是我还是不明白,为什么书中会有这种符号,书中没有对它进行定义,却把它用作标准符号。 >.> 甚至出现在书的索引和所有不同 Haskell 运算符的图表中...... - HHC

3

(>.>)在标准库中似乎没有定义。不过,在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

2
Hoogle对于查找由函数实例化的>>>不是很有帮助。 :( - Dan Burton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接