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

leo*_*leo 1 haskell typeclass

mappend函数只是关联操作的一个特例,其中两个元素属于同一类型.为什么没有包提出没有这种条件的关联函数的实现?

使用多参数类型类扩展时,这将非常简单:

{-# Language MultiParamTypeClasses #-}

module Append where

class Append a b where
    (<->) :: a -> b -> a
Run Code Online (Sandbox Code Playgroud)

然后,根据实例的实现,它将允许将Int与String连接:

"I am " <-> 42
> "I am 42"
Run Code Online (Sandbox Code Playgroud)

或者为数据记录类型添加可选参数:

data MyType = MyType {_option :: Maybe String}

myType = MyType Nothing

myTypeWithOption = myType <-> "Hello!"
Run Code Online (Sandbox Code Playgroud)

我试图搜索Hoogle,Hayoo!并在网上但找不到这样的功能.

所以:a)它存在吗?b)如果不是为什么?

Car*_*arl 8

还有的(各种)的推广MonoidbaseControl.Category:

class Category cat where
    id :: cat a a
    (.) :: cat b c -> cat a b -> cat a c
Run Code Online (Sandbox Code Playgroud)

它具有相同的法律所Monoid-事实上,该文件明确表示, " id(.)必须形成一个独异."

这不是一个真正的概括,因为它不适用于相同的类型.但是,关联性正是因为它所使用的类型的限制才起作用.


Pet*_*lák 6

你所描述的是一组幺半群的动作.在Haskell中,这可以定义为

class Monoid m => MonoidAction m s where
  act :: m -> s -> s

infixr 5 `act`
Run Code Online (Sandbox Code Playgroud)

这是一个左侧的幺半群动作s,你也可以有一个正确的动作,反转的参数(你有).该操作必须与monoid操作兼容,如下所示:

a `act` (b `act` x)  ==  (a <> b) `act` x
mempty `act` x       ==  x
Run Code Online (Sandbox Code Playgroud)

另一种方式如何查看一个独异的动作和法律是Endo . act一个同态,从幺mEndo s-在同态的独异s.

请注意,对于每个monoid,您可以通过定义来定义其自身的操作

instance Monoid m => MonoidAction m m where
  act = mappend
Run Code Online (Sandbox Code Playgroud)

请参阅模块Data.Monoid.Action.