代码之家  ›  专栏  ›  技术社区  ›  yilmazhuseyin

使用控件从子列表获取值列表。镜头

  •  0
  • yilmazhuseyin  · 技术社区  · 8 年前

    我试图从子结构中获取值列表。 我有以下结构

    ("Value",[(1,"1"),(2,"2"),(3,"3"),(4,"4"),(5,"5")])
    

    我试图得到列表中元组的第二个元素。

    ["1", "2" , "3" , "4" , "5"]
    

    view (_2 . toListOf . _2) a
    

    我也试过 traverse 对列表具有折叠效果。我需要结果作为一个列表。

    Prelude Control.Lens> let a = ("Value", [(i, show i)|i<-[1..5]]) :: (String, [(Int, String)])
    Prelude Control.Lens> a
    ("Value",[(1,"1"),(2,"2"),(3,"3"),(4,"4"),(5,"5")])
    Prelude Control.Lens> view (_2 . toListOf . _2) a
    
    <interactive>:36:7: error:
        • Couldn't match type ‘[]’ with ‘Const t’
          Expected type: Getting t (String, [(Int, String)]) t
            Actual type: (t -> Const t t)
                         -> (String, [(Int, String)]) -> [(String, [(Int, String)])]
        • In the first argument of ‘view’, namely ‘(_2 . toListOf . _2)’
          In the expression: view (_2 . toListOf . _2) a
          In an equation for ‘it’: it = view (_2 . toListOf . _2) a
        • Relevant bindings include it :: t (bound at <interactive>:36:1)
    
    <interactive>:36:23: error:
        • Couldn't match type ‘Const t t0’
                         with ‘[(Int, String)]
                               -> Const (Data.Monoid.Endo [[(Int, String)]]) [(Int, String)]’
          Expected type: (t -> Const t t)
                         -> Getting
                              (Data.Monoid.Endo [[(Int, String)]])
                              [(Int, String)]
                              [(Int, String)]
            Actual type: (t -> Const t t)
                         -> ([(Int, String)]
                             -> Const (Data.Monoid.Endo [[(Int, String)]]) [(Int, String)])
                         -> Const t t0
        • In the second argument of ‘(.)’, namely ‘_2’
          In the second argument of ‘(.)’, namely ‘toListOf . _2’
          In the first argument of ‘view’, namely ‘(_2 . toListOf . _2)’
        • Relevant bindings include it :: t (bound at <interactive>:36:1)
    Prelude Control.Lens>
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   freestyle    8 年前

    文件说:

    查看吸气剂、Iso或透镜指向的值,或折叠指向单面值的折叠或遍历的所有结果的结果。

    你需要使用 toListOf 相反 view 例如:

    toListOf (_2.traverse._2) a
    

    a ^.. _2 . traverse . _2
    

    所以 托利斯托夫 这不是镜头,只是另一个操作员 看法 ,但它提取了 折叠 .