如何将fclabels镜头提升到Monad?

i

我正在尝试使用fclabels将一些旧代码v0.4更新v2.0lts -3.17),从而将label/lens提升为monad。旧的代码是:

{-# LANGUAGE TypeOperators #-}
import Data.Record.Label
import Control.Monad (liftM, liftM2)

liftMLabel :: Monad m => a :-> b -> m a :-> m b
liftMLabel l = label (liftM $ get l) (liftM2 $ set l)

因此,我要做的第一件事是将更label改为lens,并将set更改modify

{-# LANGUAGE TypeOperators #-}
import Data.Label
import Control.Monad (liftM, liftM2)

liftMLabel :: Monad m => a :-> b -> m a :-> m b
liftMLens l = lens (liftM $ get l) (liftM2 $ modify l)

这产生了以下编译器错误:

Expected type: (m b -> m b) -> m a -> m a
  Actual type: m (b -> b) -> m a -> m a

这很有意义,给出了如何liftM2处理lens modify函数的每个参数

旧的fclabels使用setter函数创建标签,该函数接受简单的value参数。modify函数,用于创建新fclabels镜头,对于需要使用现有的值修改功能,我明白为什么它也将在单子参数上操作。

我需要为Modify函数执行一些额外的工作,并且我发现这样ap做的效果与我想要的类似,但是我不清楚总体上最好的方法是什么。

那么处理该modify函数的一种好方法是什么,这样我就可以匹配期望的类型?

仙人掌

与其尝试以一种无意义的方式一次性全部编写,为什么不直接编写它呢?

liftMLens :: (Monad m) => a :-> b -> m a :-> m b
liftMLens l = lens (liftM $ get l) $ \f mx -> do
    x <- mx
    let v = get l x
    v' <- f $ return v
    return $ set l v' x

当然,如果您确实想这样做,则可以对其进行编码处理。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将更改提升到已经提升的参考

来自分类Dev

如何将PartialFunction提升到任一

来自分类Dev

如何将XML名称空间提升到根元素

来自分类Dev

如何将权限提升到 bash 中的 root 并返回?

来自分类Dev

如何将浮动提升到另一个类的实例?

来自分类Dev

将计算从State monad提升到RWS monad

来自分类Dev

将值提升到ValidationNel中

来自分类Dev

我如何将家庭办公网络从消费者级的性能提升到小型办公室级的性能?

来自分类Dev

将双射提升到函子中

来自分类Dev

Doobie-将任意效果提升到ConnectionIO

来自分类Dev

将双射提升到函子中

来自分类Dev

将RealFrac提升到另一RealFrac功能

来自分类Dev

将天真的日期时间提升到系统时区

来自分类Dev

Numpy - 将负元素提升到非整数幂

来自分类Dev

如何从2013年提升到2015年?

来自分类Dev

从任一提升到IO

来自分类Dev

酿造链接提升到自制python

来自分类Dev

Scala从List [A]提升到List [Option [A]]

来自分类Dev

将函数及其参数提升到不同的单子上下文

来自分类Dev

将函数及其参数提升到不同的Monadic上下文

来自分类Dev

将事件从子组件提升到 Vue.js 中的容器组件?

来自分类Dev

如何在 ES6 中将变量提升到所有导入之上?

来自分类Dev

变量声明是否提升到 if 作用域块的顶部?

来自分类Dev

将数组提升到另一个数组的功效-即扩展数组的尺寸

来自分类Dev

LET vs VAR以及从大范围提升到全球范围

来自分类Dev

有没有一种方法可以使用人工制品将人工制品从Jenkins中的一个仓库自动提升到另一个仓库

来自分类Dev

为什么条件块中的函数声明被提升到Chrome而不是Firefox中的函数作用域?

来自分类Dev

在LVM缓存中增加了块大小之后,文件不再被提升到缓存中

来自分类Dev

函数作用域中的变量是否像全局作用域中的变量一样被提升到开头?

Related 相关文章

  1. 1

    如何将更改提升到已经提升的参考

  2. 2

    如何将PartialFunction提升到任一

  3. 3

    如何将XML名称空间提升到根元素

  4. 4

    如何将权限提升到 bash 中的 root 并返回?

  5. 5

    如何将浮动提升到另一个类的实例?

  6. 6

    将计算从State monad提升到RWS monad

  7. 7

    将值提升到ValidationNel中

  8. 8

    我如何将家庭办公网络从消费者级的性能提升到小型办公室级的性能?

  9. 9

    将双射提升到函子中

  10. 10

    Doobie-将任意效果提升到ConnectionIO

  11. 11

    将双射提升到函子中

  12. 12

    将RealFrac提升到另一RealFrac功能

  13. 13

    将天真的日期时间提升到系统时区

  14. 14

    Numpy - 将负元素提升到非整数幂

  15. 15

    如何从2013年提升到2015年?

  16. 16

    从任一提升到IO

  17. 17

    酿造链接提升到自制python

  18. 18

    Scala从List [A]提升到List [Option [A]]

  19. 19

    将函数及其参数提升到不同的单子上下文

  20. 20

    将函数及其参数提升到不同的Monadic上下文

  21. 21

    将事件从子组件提升到 Vue.js 中的容器组件?

  22. 22

    如何在 ES6 中将变量提升到所有导入之上?

  23. 23

    变量声明是否提升到 if 作用域块的顶部?

  24. 24

    将数组提升到另一个数组的功效-即扩展数组的尺寸

  25. 25

    LET vs VAR以及从大范围提升到全球范围

  26. 26

    有没有一种方法可以使用人工制品将人工制品从Jenkins中的一个仓库自动提升到另一个仓库

  27. 27

    为什么条件块中的函数声明被提升到Chrome而不是Firefox中的函数作用域?

  28. 28

    在LVM缓存中增加了块大小之后,文件不再被提升到缓存中

  29. 29

    函数作用域中的变量是否像全局作用域中的变量一样被提升到开头?

热门标签

归档