Ответ 1
Аппликативные функторы работают здесь довольно хорошо.
import Control.Applicative
mean = (/) <$> sum <*> (fromIntegral . length)
Скажем, что у меня есть функция 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?
Аппликативные функторы работают здесь довольно хорошо.
import Control.Applicative
mean = (/) <$> sum <*> (fromIntegral . length)
Да, ваша tacit
функция liftM2
в монаде (->) r
(liftM2
находится в Control.Monad
, а экземпляр функции Monad находится в Control.Monad.Instances
).
Я нашел это с помощью программы pointfree
(вы можете установить ее через cabal install pointfree
), вызывается как:
$ pointfree '\xs -> sum xs / (fromIntegral $ length xs)'
(в терминале Unix)