在Haskell隐性函数组合(Tacit function composition in Haske

2019-07-31 03:25发布

说我有一个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)

但感觉像有可能是避免使用一个明确的功能像这样的一种方式。 我是在想; 有一些方法可以做到这一点是建立在哈斯克尔?

Answer 1:

应用型仿函数工作得很好这里。

import Control.Applicative

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


Answer 2:

是的,你的tacit功能liftM2(->) r单子( liftM2Control.Monad ,和单子的功能情况是Control.Monad.Instances )。

我发现这个使用pointfree程序(您可以通过安装它cabal install pointfree ),援引为:

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

(在Unix终端)



文章来源: Tacit function composition in Haskell