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)如果不是为什么?
还有的(各种)的推广Monoid中base的Control.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和(.)必须形成一个独异."
这不是一个真正的概括,因为它不适用于相同的类型.但是,关联性正是因为它所使用的类型的限制才起作用.
你所描述的是一组幺半群的动作.在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一个同态,从幺m到Endo s-在同态的独异s.
请注意,对于每个monoid,您可以通过定义来定义其自身的操作
instance Monoid m => MonoidAction m m where
act = mappend
Run Code Online (Sandbox Code Playgroud)
请参阅模块Data.Monoid.Action.
| 归档时间: |
|
| 查看次数: |
146 次 |
| 最近记录: |