遍历/镜头有单子效应

时间:2019-06-16 07:56:09

标签: haskell lens lenses

我有一个遍历mytraversal和一个函数f: a -> a,可以按如下方式使用:mydata & mytraversal %~ f

但是,如果我用f: a -> m a来代替m,该怎么办?就我而言,这是一个状态monad,我想修改结构项,修改当前状态。

1 个答案:

答案 0 :(得分:4)

const e = (tag, attrs, children) => {
  const { dataset, ...otherAttrs } = attrs;
  if (dataset) {
    for (const key in dataset) {
      otherAttrs[`data-${key}`] = dataset[key];
    }
  }
  return React.createElement(tag, otherAttrs, children);
};

e("h1", {dataset: {"tippy-content": "foo"}}, ...);

所以,真的,只是

type Traversal s t a b = forall f. Applicative f => (a -> f b) -> s -> f t

应该做。如果您需要运算符,则称为(%%~)

mydata & mytraversal f