13

假设我有一个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 中的方法来做到这一点?

4

2 回答 2

20

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

import Control.Applicative

mean = (/) <$> sum <*> (fromIntegral . length)
于 2012-08-21T20:10:26.293 回答
14

是的,你的tacit函数liftM2(->) rmonad 中(liftM2是 in Control.Monad,而 Monad 的函数实例是 in Control.Monad.Instances)。

我使用pointfree程序找到了这个(你可以通过 安装它cabal install pointfree),调用如下:

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

(在 Unix 终端中)

于 2012-08-21T18:57:21.433 回答