标签: functor

为什么在函数上使用函子?

相比

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)

c++ stl functor

54
推荐指数
3
解决办法
2万
查看次数

重复fmap的乐趣

我在玩弄玩家,我发现了一些有趣的东西:

平凡的,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)

haskell functor

54
推荐指数
1
解决办法
1804
查看次数

可折叠的一个例子,它不是一个Functor(或不是Traversable)?

一个Foldable实例可能是某种容器,因此也可能是一个容器Functor.确实,

一个Foldable类型也是一个容器(虽然类不技术上要求Functor,有趣Foldables为所有Functor为s).

那么有一个例子,Foldable它不是自然的a Functor或a Traversable?(也许Haskell维基页错过了:-))

haskell traversal functor fold

53
推荐指数
3
解决办法
4469
查看次数

为什么要覆盖operator()?

Boost Signals库中,它们重载了()运算符.

这是C++中的约定吗?对于回调等?

我在同事的代码中看到了这一点(恰好是Boost的忠实粉丝).在那里的所有Boost善良中,这只会让我感到困惑.

有关这种超载原因的任何见解?

c++ boost operator-overloading functor function-call-operator

52
推荐指数
6
解决办法
6万
查看次数

仿函数如何在哈斯克尔工作?

我正在努力学习Haskell,而且我已经完成了所有的基础知识.但是现在我被卡住了,试图让我的头围绕着仿函数.

我读到"仿函数将一个类别转换为另一个类别".这是什么意思?

我知道这有很多问题,但是有人能给我一个关于仿函数的简单英语解释或者一个简单的用例吗?

haskell functional-programming functor

44
推荐指数
5
解决办法
1万
查看次数

仿函数和endofunctors之间的差异

有人可以简单地解释两者之间的区别吗?我并没有完全理解monad是endofunctor而不仅仅是functor的部分.

haskell functional-programming functor

42
推荐指数
1
解决办法
9755
查看次数

将仿函数作为函数指针传递

我正在尝试在C++应用程序中使用C库,并在以下情况下找到了自己(我知道我的C,但我对C++很新).在C方面,我有一组函数,它们以函数指针作为参数.在C++方面,我有一个带有仿函数的对象,它与C函数所需的函数指针具有相同的签名.有没有办法使用C++仿函数作为函数指针传递给C函数?

c c++ functor

41
推荐指数
3
解决办法
2万
查看次数

了解Either如何是Functor的一个实例

在我的空闲时间,我正在学习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)

现在:

  1. 我知道 fmap :: (c -> d) -> f c -> f d

  2. 如果我们替换f,Either a我们得到fmap :: (c -> d) -> Either …

haskell functor typeclass either

36
推荐指数
3
解决办法
7099
查看次数

如果SML.NET有仿函数为什么不能F#?

这个问题始于

  1. 我将LC PAULSON 的" ML for the working Programmer "(WorldCat)翻译成F#,它使用仿函数作为例子.
  2. 最终希望翻译使用仿函数的Chris Okasaki的" Purely Functional Data Structures "(WorldCat).
  3. 阅读" 类别类型和结构 - 工作计算机科学家类别理论导论 "(WorldCat),作者:Andrea Asperti和Giuseppe Longo.
  4. 不理解这一切,主要是类别理论.

SML.NET可以做仿函数并使用Microsoft .NET.
*请参阅:SML.NET用户指南第4.8.2节类类型和仿函数?

由于Microsoft .NET的一些限制,我一直看到F#无法做真正的仿函数.
*ML仿函数可以用.NET完全编码(C#/ F#)吗?
*算子的任何解决方法?

那么如果SML.NET可以在.NET上运行仿函数那么为什么F#不能呢?SML.NET做了什么,F#不能做什么?

我越了解来自类别理论的仿函数,我越看到它们的美丽,并希望在F#中拥有它们.

编辑

在追求更好的理解范畴论和函数式编程之间的关系看,这些Q&ACS回答#.

f# ocaml ml sml functor

36
推荐指数
1
解决办法
3197
查看次数

为什么2元组Functor实例仅将该函数应用于第二个元素?

import Control.Applicative

main = print $ fmap (*2) (1,2)
Run Code Online (Sandbox Code Playgroud)

生产(1,4).我希望它能够生成(2,4)但是该函数仅应用于元组的第二个元素.

更新我基本上已经基本上直接解决了这个问题.我会在一分钟内发布自己的答案..

haskell tuples functor

34
推荐指数
3
解决办法
6745
查看次数