给出一个Maybe Int,我试着将它mappend到自己。
$let x = Just 55 :: Maybe Int
$mappend x x
<interactive>:126:1:
No instance for (Monoid Int) arising from a use of `mappend'
In the expression: mappend x x
In an equation for `it': it = mappend x x
看着,我看到:
么半群a =>么半群(可能是a)
由于不实现Monoid类型类
我正在研究“向你学习哈斯克尔”,我在研究么半群。在本节中,作者按如下方式定义了树的foldMap方法:
instance F.Foldable Tree where
foldMap f Empty = mempty
foldMap f (Node x l r) = F.foldMap f l `mappend`
f x `mappend`
F.foldMap f r
它工作得很好而且完全是球型的。然而,他接着说:“现在我们的
在范畴论中,是两个伴随函子的组合。例如,可能单子是由遗忘函子组成的自由点集函子。同样,列表单体是由遗忘函子组成的自由么半群函子。
Monoid是最简单的代数结构之一,所以我想知道编程是否可以从更复杂的结构中受益。我没有在标准的Haskell包中找到免费的group monad,所以我将在这里定义它
data FreeGroup a = Nil | PosCons a (FreeGroup a) | NegCons a (FreeGroup a)
定义==运算符是为了让NegCons x (PosCons x y) == y。因此,在length :: FreeGroup a -> Int
我需要一个函数,它将选择一个非空么半群。对于列表,这将意味着以下行为:
> [1] `mor` []
[1]
> [1] `mor` [2]
[1]
> [] `mor` [2]
[2]
现在,我实际上已经实现了它,但我想知道是否有一些标准的替代方案,因为它似乎是一种常见的情况。不幸的是,胡格尔帮不上忙。
下面是我的实现:
mor :: (Eq a, Monoid a) => a -> a -> a
mor a b = if a /= mempty then a else b
假设我有一个函数(它没有任何实际应用,只是学术兴趣,因此写它的方式很奇怪,有么半群,应用函数式和定点组合符)
f :: Num a => a -> Sum a
f = fix ((<>) <$> Sum <*>)
它可以检查类型,但是在我测试它之前,我不能确定它是否能完成预期的工作。
如何测试和/或调试它?我的意思是像是在几次迭代后看到结果,就像使用take 10 [1..]是可能的。
我对:break和:step等ghci的简单调试工具略知一二,但它会进入非终止计算阶段,所以我无法检查任何东西(甚至^C它都有问题)。我也不知道如何在这个函数中使
我可以使用类型类在Coq中天真地构造代数结构的层次结构。我在寻找有关Coq的类型类的语法和语义的资源时遇到了一些麻烦。然而,我相信下面是半群,么半群和交换么半群的正确实现:
Class Semigroup {A : Type} (op : A -> A -> A) : Type := {
op_associative : forall x y z : A, op x (op y z) = op (op x y) z
}.
Class Monoid `(M : Semigroup) (id : A) : Type := {
id_ident_left : forall x