我有这个仿函数类:
#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)
编译时我遇到很多错误,例如:
错误C2780:'iterator_traits <_Iter> :: difference_type std :: count_if(_InIt,_InIt,_Pr)':需要3个参数 - 提供2个参数
我不太了解count_if是如何工作的,我试着写这段代码从这个答案中激励自己:https://stackoverflow.com/a/13525420
我没有看到我错在哪里,编译器错误让我感到困惑.
在范畴论中,函子的概念如下:
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 概念实现到代码中,似乎就不可能定义F
或fmap
像上图所示那样简单。
事实上,有一篇关于 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。
为什么函子范畴论的概念和包装及展开从“盒子” /的概念不匹配呢?
编辑:
即使对于IO
functor,在组合过程中,f
也是解包的:
我刚刚开始再次学习 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
。问题是,我觉得这可以通过使用一元运算符(或者可能使用函子)而不使用匹配表达式来更优雅地实现。有这样的运营商吗?
为什么这个算符定义被拒绝了?
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) 能否请您举例说明以下陈述
语句1
普通函数只有在签名不同时才有不同的类型.但是,当函数对象的签名相同时,它们可以具有不同的类型.实际上,函数对象定义的每个函数行为都有自己的类型.这是使用模板进行泛型编程的重大改进,因为您可以将功能行为作为模板参数传递
我查看过去的讨论,但无法理解为什么任何答案都是正确的.
合用的
<*> :: 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) …
请执行功能:
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)
或者,解释为什么不能这样做?