假设我有一个定义如下的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
函数是(->) r
monad中的liftM2
(liftM2
在Control.Monad
中,monad的函数实例在Control.Monad.Instances
中)。
我使用pointfree
程序(您可以通过cabal install pointfree
安装它)发现了这一点,调用为:
$ pointfree 'xs -> sum xs / (fromIntegral $ length xs)'
(在Unix终端中)