标签: functor

我不能做一个简单的仿函数来比较字符串

我有这个仿函数类:

#include <string>

using namespace std;

class IsPlayerOfType
{
    public:
        IsPlayerOfType(const string& type) : type_(type) {}

        bool operator()(const Player* player) const
        {
            return (player->getType() == type_);
        }
    private:
        string type_;
};
Run Code Online (Sandbox Code Playgroud)

"Player"类表示具有多种方法和属性的玩家.其中,有getType()方法返回一个字符串.

在我的程序的某些时候,我有一个名为players_type 的变量vector<Player*>

最后,我有以下代码来计算我的向量中某种类型的玩家数量:

int number = count_if(players_.begin(), players_.end(), IsPlayerOfType("Defensive"));
Run Code Online (Sandbox Code Playgroud)

编译时我遇到很多错误,例如:

  • 错误C2011:'IsPlayerOfType':'class'类型重定义
  • 错误C2440:'':无法从'const char [10]'转换为'IsPlayerOfType'
  • 错误C2780:'iterator_traits <_Iter> :: difference_type std :: count_if(_InIt,_InIt,_Pr)':需要3个参数 - 提供2个参数

    我不太了解count_if是如何工作的,我试着写这段代码从这个答案中激励自己:https://stackoverflow.com/a/13525420

    我没有看到我错在哪里,编译器错误让我感到困惑.

c++ std functor

-1
推荐指数
1
解决办法
89
查看次数

处理“BOX”的 Haskell 函子实现?

在范畴论中,函子的概念如下:

https://ncatlab.org/nlab/show/functor

在此处输入图片说明

在 Haskell 中,Functor类型可以表示为:

fmap :: (a -> b) -> f a -> f b

https://hackage.haskell.org/package/base-4.14.0.0/docs/Data-Functor.html

我可以看到两者真的很好地对应。

然而,一旦我们真正尝试将这个 Functor 概念实现到代码中,似乎就不可能定义Ffmap像上图所示那样简单。

事实上,有一篇关于 Functor/Monad 的著名文章。

图片中的函子、应用程序和单子

这里,

足够简单。让我们通过说任何值都可以在上下文中来扩展这一点。现在,您可以将上下文视为一个盒子,您可以在其中放置一个值:

在此处输入图片说明

或者

以下是我们编写 fmap (+3)(仅 2)时幕后发生的事情:

在此处输入图片说明

我一直觉得Functor函子范畴论的概念,并从“盒子”,包装及解包到/的概念不匹配良好。

问题点 1。

fmap :: (a -> b) -> f a -> f b

https://hackage.haskell.org/package/base-4.14.0.0/docs/Data-Functor.html

在 Haskell 中,wrap&unwrap to/from "BOX" 的实际实现在哪里?

问题点2。

为什么函子范畴论的概念包装及展开从“盒子” /的概念不匹配呢?

编辑:

即使对于IOfunctor,在组合过程中,f也是解包的:

haskell functor category-theory category-abstractions

-1
推荐指数
2
解决办法
180
查看次数

有没有更好的方法来编写这个 haskell 函数?

我刚刚开始再次学习 Haskell(我已经尝试过几次)并且我写了一个小函数,它应该将文件下载到给定的文件路径。如果 URL 是Some它应该下载文件,如果是Nothing它应该什么都不做。

downloadFile :: URL -> FilePath -> IO ()
downloadFile url fp = ...        

maybeDownloadFile :: Maybe URL -> FilePath -> IO ()
maybeDownloadFile ( Just url ) fp = downloadFile url fp
maybeDownloadFile Nothing fp = return ()
Run Code Online (Sandbox Code Playgroud)

所以它本质上只是包装了downloadFile函数,但是用 aMaybe URL而不是 a URL。问题是,我觉得这可以通过使用一元运算符(或者可能使用函子)而不使用匹配表达式来更优雅地实现。有这样的运营商吗?

monads haskell functor

-1
推荐指数
1
解决办法
98
查看次数

双类型Functor定义被拒绝

为什么这个算符定义被拒绝了?

data Second a b = Ok a b | Ko a b deriving (Show)

instance Functor (Second x) where
  fmap f (Ok a b ) = Ok (f a) b
  fmap f (Ko a b ) = Ko a (f b) 
Run Code Online (Sandbox Code Playgroud)

收到很多错误:

GHCi, version 8.0.1

main.hs:4:22: error:
    • Couldn't match type ‘b’ with ‘x’
      ‘b’ is a rigid type variable bound by
        the type signature for:
          fmap :: forall a b. (a -> b) -> Second x …
Run Code Online (Sandbox Code Playgroud)

haskell types compiler-errors functor

-2
推荐指数
1
解决办法
112
查看次数

C++ Functors解释

能否请您举例说明以下陈述

语句1

普通函数只有在签名不同时才有不同的类型.但是,当函数对象的签名相同时,它们可以具有不同的类型.实际上,函数对象定义的每个函数行为都有自己的类型.这是使用模板进行泛型编程的重大改进,因为您可以将功能行为作为模板参数传递

c++ functor c++11

-4
推荐指数
1
解决办法
227
查看次数

Monad比Applicative更强大?

我查看过去的讨论,但无法理解为什么任何答案都是正确的.

合用的

<*> :: f (a -> b) -> f a -> f b

单子

(>>=) :: m a -> (a -> m b) -> m b

因此,如果我做对了,那么声称是>>=不能仅仅假设存在而写的<*>

好吧,让我们假设我有<*>.

我想创造>>=.

所以我有f a.

我有f (a -> b).

现在当你看它时,f (a -> b)可以写成(a -> b)(如果某个东西是x,y,z的函数 - 那么它也是x,y的函数).

所以从<*>我们得到的存在(a -> b) -> f a -> f b再次可以写成((a -> b) -> f a) …

monads haskell functional-programming functor applicative

-4
推荐指数
2
解决办法
310
查看次数

撰写应用功能

请执行功能:

composeApplicative :: (Applicative f) => f (b -> c) -> f (a -> b) -> f (a -> c)
Run Code Online (Sandbox Code Playgroud)

这样:

(composeApplicative f g) <*> x == f <*> (g <*> x)
Run Code Online (Sandbox Code Playgroud)

或者,解释为什么不能这样做?

haskell functor function-composition applicative

-6
推荐指数
1
解决办法
116
查看次数