假设我有一个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?
我正在考虑像Ruby这样的纯面向对象语言,其中包括数字,int,浮点数和字符串在内的所有内容本身就是对象.这与纯函数式语言是一回事吗?例如,在Haskell中,Numbers和Strings是否也起作用?
我知道Haskell基于lambda演算,它将所有内容(包括数据和操作)表示为函数.对我来说,"纯粹的函数式语言"将所有内容都作为一个函数进行建模,并且保持一个函数最常返回相同输出且具有相同输入且没有状态的定义,这似乎是合乎逻辑的.
我希望能够使用二元运算符在haskell中组合数值函数.因此,例如,使用一元数字函数:
f*g
Run Code Online (Sandbox Code Playgroud)
应翻译为:
\x -> (f x)*(g x)
Run Code Online (Sandbox Code Playgroud)
并且类似地添加.让你自己的操作员这么做是非常简单的,但我真的很想让Num a => a -> a函数成为Num的一个实例,但我不知道该怎么做.
我也想使这个参数数量通用的,但可能是因为这是多么难以做到的元数泛型函数在Haskell太麻烦了,所以它可能只是更好地界定独立Num a => a -> a -> a,Num a => a -> a -> a -> a等...实例了一些数量相当大.