mappend函数只是关联操作的一个特例,其中两个元素属于同一类型。为什么没有包提出没有这种条件的关联函数的实现?
对于多参数类型类扩展,这将非常简单:
{-# Language MultiParamTypeClasses #-}
module Append where
class Append a b where
(<->) :: a -> b -> a
然后,根据实例的实现,它将允许将Int与String连接:
"I am " <-> 42
> "I am 42"
或将可选参数添加到数据记录类型:
data MyType = MyType {_option :: Maybe String}
myType = MyType Nothing
myTypeWithOption = myType <-> "Hello!"
我试图搜索Hoogle,Hayoo!并在网上但找不到这样的功能。
所以:a)它存在吗? b)如果不是为什么?
答案 0 :(得分:8)
Monoid
base
Control.Category
中class Category cat where
id :: cat a a
(.) :: cat b c -> cat a b -> cat a c
的概括(各种):
Monoid
它与id
具有相同的法律 - 事实上,the documentation explicitly says&#34; (.)
和{{1}}必须形成一个幺半群。&#34;
这不是一个真正的概括,因为它不适用于相同的类型。但是,关联性正是因为对它所使用的类型的限制才起作用。
答案 1 :(得分:6)
您所描述的是an action of a monoid on a set。在Haskell中,这可以定义为
class Monoid m => MonoidAction m s where
act :: m -> s -> s
infixr 5 `act`
这是s
上的左幺半群操作,您也可以使用正确的操作,反转参数(如您所示)。
该动作必须与幺半群操作兼容,如下所示:
a `act` (b `act` x) == (a <> b) `act` x
mempty `act` x == x
如何查看幺半群动作及其定律的另一种方法是Endo . act
homomorphism从幺半群m
到Endo s
- {{1}上的内同态}。
请注意,对于每个monoid,您可以通过定义
来定义其自身的操作s
参见模块Data.Monoid.Action。
答案 2 :(得分:3)
一般情况下,如果两个参数的类型不同,则无法定义关联性。如果你尝试,它将不是正确的类型。