通过对Haskell中二进制函数的两个参数进行某些转换来"提升"哪个是最惯用的方法?

ram*_*try 5 monads haskell functional-programming arrows applicative

通过对Haskell中二进制函数的两个参数进行某些转换来"提升"哪个是最惯用的方法?让这个运算符命名为"lift",所以我希望它的类型是

lift :: (a -> b) -> (b -> b -> c) -> (a -> a -> c)
Run Code Online (Sandbox Code Playgroud)

一个天真的定义将是

lift t f = \x y -> f (t x) (t y)
Run Code Online (Sandbox Code Playgroud)

Zet*_*eta 15

它被称为on(from Data.Function),尽管有翻转的参数:

on :: (b -> b -> c) -> (a -> b) -> a -> a -> c
-- lift = flip on
Run Code Online (Sandbox Code Playgroud)

请注意,您可以使用Hoogλe查询轻松找到该函数.另请注意,已有一个功能lift,用于完全其他设置,即monad变换器.