Тацит-функция в Haskell

Скажем, что у меня есть функция mean, определенная так:

mean xs = sum xs / (fromIntegral $ length xs)

но я хочу его в некоторой негласной форме, например:

mean = sum / (fromIntegral . length)

Есть ли встроенный способ Haskell, чтобы сделать что-то в этом направлении, не создавая собственную функцию tacit (что-то вроде этого):

tacit :: (a -> b -> c) -> (d -> a) -> (d -> b) -> d -> c
tacit a b c i = a (b i) (c i)

В этом виде функция выглядит следующим образом:

mean = tacit (/) sum (fromIntegral . length)

но кажется, что может быть способ избежать использования явной функции, такой как это. Мне просто интересно; есть ли способ сделать это, который встроен в Haskell?

Ответ 1

Аппликативные функторы работают здесь довольно хорошо.

import Control.Applicative

mean = (/) <$> sum <*> (fromIntegral . length)

Ответ 2

Да, ваша tacit функция liftM2 в монаде (->) r (liftM2 находится в Control.Monad, а экземпляр функции Monad находится в Control.Monad.Instances).

Я нашел это с помощью программы pointfree (вы можете установить ее через cabal install pointfree), вызывается как:

$ pointfree '\xs -> sum xs / (fromIntegral $ length xs)'

(в терминале Unix)