用镜头过滤复合结构

Nar*_*ius 9 haskell lenses

我有一个[(a, Maybe b)],并希望获得一个[(a, b)],所有对,其中第二个元素被Nothing过滤掉.是否有一种简洁的方法来描述使用镜头的操作?

dan*_*iaz 12

怎么样的

[('a',Just 1),('b',Nothing)]^..folded.aside _Just 
Run Code Online (Sandbox Code Playgroud)

使用(^..)foldedControl.Lens.Foldaside_JustControl.Lens.Prism.

关键是aside,一个方便的功能,从一个工作在一对组件上的棱镜构建一对棱镜.


Ing*_*ngo 9

尽管镜片非常巧妙,但下面的内容可能是简洁的标志:

[ (a, b) | (a, Just b) <- list ]
Run Code Online (Sandbox Code Playgroud)

(更不用说可读性了.)

  • 确实如此,@ Narvius.Haskell 2010年报告,pg.22:这样的列表推导返回通过在限定符列表中由生成器的嵌套的深度优先评估创建的连续环境中评估e而产生的元素列表.变量的绑定根据正常的模式匹配规则发生(参见第3.17节),**如果匹配失败,则简单地跳过该列表的元素.** (4认同)
  • 当与`<-`的模式匹配失败时,它会调用相应monad的`fail`,对于列表,这是`[]`. (3认同)
  • 暂时搁置我完全忘记Haskell的事实有列表理解...为什么这也会过滤?我已经习惯了那些告诉我有一种非详尽模式的事情.列表推导简单地抛弃了代数类型的非匹配构造函数的值吗?我从来没有听说过这个功能. (2认同)