在对文件Free
说:
许多常见的单子出现为免费单子,
- 鉴于
data Empty a
,Free Empty
与Identity
monad 同构.- Free
Maybe
可用于建模偏好monad,其中每个图层表示运行计算的时间更长.
还有哪些monad可以使用Free
?
我只想到一个:我相信Free (Const e)
是同构的Either e
.
编辑:哪些monad 不能用于表达Free
?为什么?
Haskell Typeclassopedia 3.2节的练习5要求在声明中提供证据或反例
两个Functors的组合也是一个Functor.
我一开始以为这是在讨论组合fmap
由两个单独的a实例定义的方法Functor
,但这并没有多大意义,因为就我所知,类型不会匹配.对于两种类型,f
并且f'
,类型fmap
将是fmap :: (a -> b) -> f a -> f b
和fmap :: (a -> b) -> f' a -> f' b
,并且实际上看起来并不可组合.那么组成两个是什么意思Functors
呢?
如上所述这个问题/答案,Functor
实例唯一确定的,如果他们存在.
对于列表,有两个众所周知的Applicative实例:[]
和ZipList
.因此,应用型不是唯一的(见GHC可以导出函子与应用型实例的单子变压器?而且为什么没有-XDeriveApplicative
推广?).但是,ZipList
需要无限列表,因为它pure
无限期地重复给定元素.
Applicative
实例?去进一步,如果我们能够扩大双方[]
和ZipList
一个单子,我们会在那里有一个单子不是唯一的数据类型和其确定的函数对象的例子.唉,只有当我们将自己限制在无限列表(流)时才有ZipList
Monad实例.并且为了创建单元素列表,所以它需要有限列表.因此:return
[]
如果有一个包含两个或更多不同实例的示例,则会出现一个明显的问题,如果它们必须/可以具有相同的Applicative实例:
最后我们可以为Alternative/MonadPlus提出同样的问题.由于存在两组不同的MonadPlus法则,这很复杂.假设我们接受一套法律(对于Applicative我们接受右/左分配/吸收,也参见这个问题),
如果以上任何一个都是独一无二的,我会有兴趣知道为什么,要有一丝证明.如果没有,反例.
我最近发现在C++中你可以以一种奇怪的方式重载"函数调用"操作符,你需要编写两对括号来执行此操作:
class A {
int n;
public:
void operator ()() const;
};
Run Code Online (Sandbox Code Playgroud)
然后以这种方式使用它:
A a;
a();
Run Code Online (Sandbox Code Playgroud)
什么时候有用?
我们有:
std::plus
(+
)std::minus
(-
)std::multiplies
(*
)std::divides
(/
)std::modulus
(%
)std::negate
(-
)std::logical_or
(||
)std::logical_not
(!
)std::logical_and
(&&
)std::equal_to
(==
)std::not_equal_to
(!=
)std::less
(<
)std::greater
(>
)std::less_equal
(<=
)std::greater_equal
(>=
)我们没有仿函数:
&
(地址)的*
(解引用)[]
,
~
,&
,|
,^
,<<
,>> …
Functor中的fmap类型是:
fmap :: Functor f => (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)
看起来,首先将函数(a - > b)应用于fa的参数以创建类型b的结果,然后对其应用f,结果为fb
使用Maybe a例如:
fmap show (Just 1)
result is : Just "1"
Run Code Online (Sandbox Code Playgroud)
同说:
Just (show 1)
Run Code Online (Sandbox Code Playgroud)
但是当( - >)用作Functor时(在Control.Monad.Instances中)
import Control.Monad.Instances
(fmap show Just) 1
result is : "Just 1"
Run Code Online (Sandbox Code Playgroud)
也就是说,Just首先应用,然后显示应用.在另一个例子中,结果是相同的:
fmap (*3) (+100) 1
result is 303
Run Code Online (Sandbox Code Playgroud)
为什么不*3先,然后+100?
一个最近的问题通常问Haskell的各种类之间的边界.我提出了Handler
一个有效的例子,Functor
没有合理的Apply
**实例,其中
class Functor f => Apply f where
(<.>) :: f (a -> b) -> f a -> f b
-- optional bits omitted.
Run Code Online (Sandbox Code Playgroud)
但是,我还没有找到一个Functor
无法成为有效(如果无意义)实例的有效示例Apply
.这一事实Apply
已经过(见更新),但单行法,
(.) <$> u <.> v <.> w = u <.> (v <.> w)
Run Code Online (Sandbox Code Playgroud)
似乎使这个相当棘手.
pigworker(康纳·麦克布莱德)前面举了一个例子的Functor
,是不是Applicative
,但他依靠pure
这样做,这不是可用Apply
.
**后来我意识到实际上可能有一个明智的(虽然有点奇怪)Apply
实例Handler
,从概念上收集同时异常.
Edward Kmett现在接受 …
STL仿函数的实现方式如下:
template<class T>
struct less{
bool operator()(T const& lhs, T const& rhs){
return lhs < rhs;
}
};
Run Code Online (Sandbox Code Playgroud)
这使我们每次创建这样的仿函数时都会提到(可能很长)类型.为什么它们没有如下所示实现?有什么原因?
struct less{
template<class T>
bool operator()(T const& lhs, T const& rhs){
return lhs < rhs;
}
};
Run Code Online (Sandbox Code Playgroud)
这将使它们可用而不提及(可能很长)类型.
functor ×10
haskell ×6
c++ ×3
monads ×2
stl ×2
applicative ×1
arrows ×1
free-monad ×1
java ×1
profunctor ×1
templates ×1
theory ×1