Ant*_*Xue 3 haskell functional-programming monoids
我有一个看起来像这样的功能
transition :: State -> ([State], [State])
Run Code Online (Sandbox Code Playgroud)
鉴于我的问题的特定领域,我知道如何将两个连续的transition函数调用链接在一起,如下所示:
transition `chain` trainsition ... `chain` transition
Run Code Online (Sandbox Code Playgroud)
不过,我想表达这种Monoid并执行与链接<>和mappend.不幸的是,我似乎无法使用以下或类似的变体来工作:
instance Monoid (State -> ([State], [State])) where
mempty = ...
mappend = ...
Run Code Online (Sandbox Code Playgroud)
返回的错误如下:
• 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]))’
Run Code Online (Sandbox Code Playgroud)
一般来说,如何将函数表示为Monoid?的实例?
函数已经以不同的方式实现了幺半群.您如何期望Haskell决定使用该实例或您的实例?解决问题的常用方法是声明一个newtype包装器,如
newtype Transition a = Transition { runTransition :: a -> ([a], [a]) }
Run Code Online (Sandbox Code Playgroud)
然后,你可以使你的monoid实例正常:
instance Monoid (Transition a) where
mempty = ...
mappend = ...
Run Code Online (Sandbox Code Playgroud)
完成此操作后,您甚至可以找到foldMap有用的信息.而不是写像
runTransition (Transition transition `chain`
Transition transition `chain`
...
Transition transition)
Run Code Online (Sandbox Code Playgroud)
您可以使用 foldMap
runTransition (foldMap Transition [transition, transition, ... transition])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
315 次 |
| 最近记录: |