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内置的方法可以做到这一点?

应用函子在这里工作得很好。

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

是的,您的tacit函数是(->) r monad中的liftM2liftM2Control.Monad中,monad的函数实例在Control.Monad.Instances中)。

我使用pointfree程序(您可以通过cabal install pointfree安装它)发现了这一点,调用为:

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

(在Unix终端中)

相关内容

  • 没有找到相关文章

最新更新