为什么不在Haskell中使用比mappend更通用的功能?

时间:2014-10-03 17:08:48

标签: haskell typeclass

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)如果不是为什么?

3 个答案:

答案 0 :(得分:8)

Monoid base Control.Categoryclass 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从幺半群mEndo s - {{1}上的内同态}。

请注意,对于每个monoid,您可以通过定义

来定义其自身的操作
s

参见模块Data.Monoid.Action

答案 2 :(得分:3)

一般情况下,如果两个参数的类型不同,则无法定义关联性。如果你尝试,它将不是正确的类型。