Haskell中(=<<)组合子的官方鸟名是什么?能否通过已有鸟名推导?
嘿,这个问题挺有意思的!先直接给你答案:你提到的这个类型为(a -> r -> b) -> (r -> a) -> r -> b的组合子,并没有一个广泛公认的专属官方鸟名,不过它完全可以用已有的经典鸟类组合子推导出来。
关于鸟名的说明
鸟类组合子的命名体系里,大部分被赋予专属鸟名的都是那些最基础、最常用的组合子(比如S星椋鸟、K鸢鸟、B蓝鸟这些)。你说的这个组合子的行为是\f g r -> f (g r) r——简单说就是把第二个函数作用在r上得到a,再把这个a和原r一起传给第一个函数得到结果。它属于“复合组合子”,通常不会单独给一个鸟名,不过有时候会被非正式地称为“应用型莺鸟(Applied Warbler)”,因为它和莺鸟(Warbler,W组合子)的行为很像,只是多了一层函数应用。
用已有组合子推导的方法
这个组合子可以通过好几种经典组合子的组合来实现,这里给你两种最直观的方式:
方式一:星椋鸟(S)+ 猫头鹰(O,即flip)
星椋鸟S的类型是(a -> b -> c) -> (a -> b) -> a -> c,行为是S f g x = f x (g x);猫头鹰O其实就是flip,类型是(x -> y -> z) -> y -> x -> z,行为是O f x y = f y x。
把它们组合起来,目标组合子可以写成:
comb = \f g r -> S (O f) g r
验证一下:S (O f) g r = O f r (g r) = f (g r) r,完全符合你给出的定义。
方式二:蓝鸟(B)+ 莺鸟(W)
蓝鸟B的类型是(b -> c) -> (a -> b) -> a -> c,行为是B f g x = f (g x);莺鸟W的类型是(a -> a -> b) -> a -> b,行为是W f x = f x x。
组合后的形式是:
comb = \f g r -> W (B f g) r
验证过程:W (B f g) r = B f g r r = f (g r) r,也完美匹配目标行为。
当然,还有其他组合方式,比如结合画眉鸟(Thrush,T)之类的,但上面这两种是最容易理解的。
内容的提问来源于stack exchange,提问作者davidkomer

