0

I am trying to get list of values from a substructure. I have the following structure

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

And I am trying to get the second element of the tuples in the list.

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

The expression I am tying is:

view (_2 . toListOf . _2) a

I have also tried traverse. But It seems like traverse has a folding effect on the list. I need the result as a list.

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>
duplode
  • 33,731
  • 7
  • 79
  • 150
yilmazhuseyin
  • 6,442
  • 4
  • 34
  • 38

1 Answers1

2

The documentation says:

View the value pointed to by a Getter, Iso or Lens or the result of folding over all the results of a Fold or Traversal that points at a monoidal value.

You need to use toListOf instead view. For example:

toListOf (_2.traverse._2) a

Or

a ^.. _2 . traverse . _2

So, toListOf isn't lens, it's just another operator like view, but it extracts a list of the targets of a Fold.

freestyle
  • 3,692
  • 11
  • 21