繁体   English   中英

函数类型为Monoid实例

[英]Function Types as Monoid Instances

我有一个看起来像这样的功能

transition :: State -> ([State], [State])

鉴于我的问题的特定领域,我知道如何将两个连续的transition函数调用链接在一起,如下所示:

transition `chain` trainsition ... `chain` transition

但是,我想将其表达为Monoid并使用<>mappend进行链接。 不幸的是,我似乎无法使用以下或类似的变体来工作:

instance Monoid (State -> ([State], [State])) where
    mempty  = ...
    mappend = ...

返回的错误如下:

• Illegal instance declaration for
    ‘Monoid (State -> ([State], [State]))’
    (All instance types must be of the form (T a1 ... an)
     where a1 ... an are *distinct type variables*,
     and each type variable appears at most once in the instance head.
     Use FlexibleInstances if you want to disable this.)
• In the instance declaration for
    ‘Monoid (State -> ([State], [State]))’

一般来说,如何将函数表示为Monoid实例?

函数已经以不同的方式实现了幺半群 您如何期望Haskell决定使用该实例或您的实例? 解决问题的常用方法是声明一个newtype包装器,例如

newtype Transition a = Transition { runTransition :: a -> ([a], [a]) }

然后,你可以使你的monoid实例正常:

instance Monoid (Transition a) where
  mempty  = ...
  mappend = ...

完成后,您甚至可以找到foldMap有用。 而不是写像

runTransition (Transition  transition `chain`
               Transition  transition `chain`
               ...
               Transition  transition)

您可以使用foldMap

runTransition (foldMap Transition [transition, transition, ... transition])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM