Nik*_*kov 2 haskell lenses haskell-lens
本着以下问题的精神:
我现在正在寻找一种方法将多个Getter组合成一个单一的Fold,以便如下所示:
('a','b','c','d') ^.. (_1 <> _2 <> _3)
Run Code Online (Sandbox Code Playgroud)
会导致这个:
['a', 'b', 'c']
Run Code Online (Sandbox Code Playgroud)
但上面的代码实际上失败并显示以下消息:
No instance for (Monoid
(Accessor (Endo [Char]) (Char, Char, Char, Char)))
arising from a use of `<>'
Run Code Online (Sandbox Code Playgroud)
那么我该如何实现呢?这可能吗?
这也可以通过此答案中发布的 Monoid 实例实现:使用镜头从地图获取多个结果
import Data.Monoid
import Control.Lens
instance Monoid r => Monoid (Accessor r a) where
mempty = Accessor mempty
mappend (Accessor a) (Accessor b) = Accessor $ a <> b
Run Code Online (Sandbox Code Playgroud)
测试:
*Control.Lens Data.Monoid> ('a','b','c','d') ^.. (_1 <> _2 <> _3)
"abc"
Run Code Online (Sandbox Code Playgroud)
“abc”只是 ['a','b','c'],所以这就是你想要的。
(更新:现代lens
版本默认包含这个实例,所以第二个代码片段应该是开箱即用的。)
归档时间: |
|
查看次数: |
207 次 |
最近记录: |