相比
double average = CalculateAverage(values.begin(), values.end());
Run Code Online (Sandbox Code Playgroud)
同
double average = std::for_each(values.begin(), values.end(), CalculateAverage());
Run Code Online (Sandbox Code Playgroud)
使用函子而不是函数有什么好处?是不是第一个更容易阅读(甚至在添加实施之前)?
假设仿函数定义如下:
class CalculateAverage
{
private:
std::size_t num;
double sum;
public:
CalculateAverage() : num (0) , sum (0)
{
}
void operator () (double elem)
{
num++;
sum += elem;
}
operator double() const
{
return sum / num;
}
};
Run Code Online (Sandbox Code Playgroud) 我在玩弄玩家,我发现了一些有趣的东西:
平凡的,id
可以在类型中实例化(a -> b) -> a -> b
.
使用我们拥有的列表仿函数fmap :: (a -> b) -> [a] -> [b]
,它与之相同map
.
在((->) r)
函子(from Control.Monad.Instances
)的情况下,fmap
是函数组合,所以我们可以实例化fmap fmap fmap :: (a -> b) -> [[a]] -> [[b]]
,这相当于(map . map)
.
有趣的是,fmap
八次给我们(map . map . map)
!
所以我们有
0: id = id
1: fmap = map
3: fmap fmap fmap = (map . map)
8: fmap fmap fmap fmap …
Run Code Online (Sandbox Code Playgroud) 在Boost Signals库中,它们重载了()运算符.
这是C++中的约定吗?对于回调等?
我在同事的代码中看到了这一点(恰好是Boost的忠实粉丝).在那里的所有Boost善良中,这只会让我感到困惑.
有关这种超载原因的任何见解?
c++ boost operator-overloading functor function-call-operator
我正在努力学习Haskell,而且我已经完成了所有的基础知识.但是现在我被卡住了,试图让我的头围绕着仿函数.
我读到"仿函数将一个类别转换为另一个类别".这是什么意思?
我知道这有很多问题,但是有人能给我一个关于仿函数的简单英语解释或者一个简单的用例吗?
有人可以简单地解释两者之间的区别吗?我并没有完全理解monad是endofunctor而不仅仅是functor的部分.
我正在尝试在C++应用程序中使用C库,并在以下情况下找到了自己(我知道我的C,但我对C++很新).在C方面,我有一组函数,它们以函数指针作为参数.在C++方面,我有一个带有仿函数的对象,它与C函数所需的函数指针具有相同的签名.有没有办法使用C++仿函数作为函数指针传递给C函数?
在我的空闲时间,我正在学习Haskell,所以这是一个初学者的问题.
在我的阅读中,我遇到了一个例子,说明如何Either a
成为一个实例Functor
:
instance Functor (Either a) where
fmap f (Right x) = Right (f x)
fmap f (Left x) = Left x
Run Code Online (Sandbox Code Playgroud)
现在,我试图理解为什么实现在Right
值构造函数的情况下映射,但是在不是的情况下Left
?
这是我的理解:
首先让我重写上面的例子
instance Functor (Either a) where
fmap g (Right x) = Right (g x)
fmap g (Left x) = Left x
Run Code Online (Sandbox Code Playgroud)
现在:
我知道 fmap :: (c -> d) -> f c -> f d
如果我们替换f
,Either a
我们得到fmap :: (c -> d) -> Either …
这个问题始于
SML.NET可以做仿函数并使用Microsoft .NET.
*请参阅:SML.NET用户指南第4.8.2节类类型和仿函数?
由于Microsoft .NET的一些限制,我一直看到F#无法做真正的仿函数.
*ML仿函数可以用.NET完全编码(C#/ F#)吗?
*算子的任何解决方法?
那么如果SML.NET可以在.NET上运行仿函数那么为什么F#不能呢?SML.NET做了什么,F#不能做什么?
我越了解来自类别理论的仿函数,我越看到它们的美丽,并希望在F#中拥有它们.
编辑
import Control.Applicative
main = print $ fmap (*2) (1,2)
Run Code Online (Sandbox Code Playgroud)
生产(1,4)
.我希望它能够生成(2,4)
但是该函数仅应用于元组的第二个元素.
更新我基本上已经基本上直接解决了这个问题.我会在一分钟内发布自己的答案..