Ben*_*ach 13 haskell function composition pointfree tacit-programming
假设我有一个mean如此定义的函数:
mean xs = sum xs / (fromIntegral $ length xs)
Run Code Online (Sandbox Code Playgroud)
但我想以某种默契形式,像这样:
mean = sum / (fromIntegral . length)
Run Code Online (Sandbox Code Playgroud)
是否有内置的Haskell方法可以在这些行中执行某些操作而无需构建自己的tacit函数(类似这样):
tacit :: (a -> b -> c) -> (d -> a) -> (d -> b) -> d -> c
tacit a b c i = a (b i) (c i)
Run Code Online (Sandbox Code Playgroud)
在这种形式中,函数如下所示:
mean = tacit (/) sum (fromIntegral . length)
Run Code Online (Sandbox Code Playgroud)
但感觉可能有一种方法可以避免使用像这样的显式函数.我是在想; 是否有一些方法可以做到内置于Haskell?
Art*_*yom 20
应用函子在这里工作得很好.
import Control.Applicative
mean = (/) <$> sum <*> (fromIntegral . length)
Run Code Online (Sandbox Code Playgroud)
huo*_*uon 14
是的,你的tacit函数liftM2在(->) rmonad中(liftM2在Control.Monad,并且Monad的函数实例在其中Control.Monad.Instances).
我发现这个使用该pointfree程序(你可以通过它安装cabal install pointfree),调用为:
$ pointfree '\xs -> sum xs / (fromIntegral $ length xs)'
Run Code Online (Sandbox Code Playgroud)
(在Unix终端中)