如何在独立Getter中使用(^?ix 0)?

How can I use (^? ix 0) in an independent Getter?

抱歉标题措辞不佳,但我什至不知道如何正确提问。

我该如何打开它?

instPublicIP :: Instance -> Maybe Text
instPublicIP inst =
  inst ^. insNetworkInterfaces ^? ix 0 . iniAssociation . _Just . iniaPublicIP . _Just

进入这个

instPublicIP' :: Lens' Instance (Maybe Text)
instPublicIP' = insNetworkInterfaces ^? ix 0 . iniAssociation . _Just . iniaPublicIP . _Just

当我尝试这样做时,出现以下错误:

Main.hs:198:3:
    Couldn't match expected type ‘(Maybe Text -> f (Maybe Text))
                                  -> Instance -> f Instance’
                with actual type ‘Maybe Text’
    Relevant bindings include
      instPublicIP' :: (Maybe Text -> f (Maybe Text))
                       -> Instance -> f Instance
        (bound at app/Main.hs:197:1)
    In the expression:
      insNetworkInterfaces
      ^? ix 0 . iniAssociation . _Just . iniaPublicIP . _Just
    In an equation for ‘instPublicIP'’:
        instPublicIP'
          = insNetworkInterfaces
            ^? ix 0 . iniAssociation . _Just . iniaPublicIP . _Just

Main.hs:198:27:
    Couldn't match type ‘InstanceNetworkInterface’
                   with ‘Instance -> f0 Instance’
    Expected type: (InstanceNetworkInterface
                    -> Const (Data.Monoid.First Text) InstanceNetworkInterface)
                   -> (([InstanceNetworkInterface] -> f0 [InstanceNetworkInterface])
                       -> Instance -> f0 Instance)
                   -> Const
                        (Data.Monoid.First Text)
                        (([InstanceNetworkInterface] -> f0 [InstanceNetworkInterface])
                         -> Instance -> f0 Instance)
      Actual type: (IxValue
                      (([InstanceNetworkInterface] -> f0 [InstanceNetworkInterface])
                       -> Instance -> f0 Instance)
                    -> Const
                         (Data.Monoid.First Text)
                         (IxValue
                            (([InstanceNetworkInterface] -> f0 [InstanceNetworkInterface])
                             -> Instance -> f0 Instance)))
                   -> (([InstanceNetworkInterface] -> f0 [InstanceNetworkInterface])
                       -> Instance -> f0 Instance)
                   -> Const
                        (Data.Monoid.First Text)
                        (([InstanceNetworkInterface] -> f0 [InstanceNetworkInterface])
                         -> Instance -> f0 Instance)
    In the first argument of ‘(.)’, namely ‘ix 0’
    In the second argument of ‘(^?)’, namely
      ‘ix 0 . iniAssociation . _Just . iniaPublicIP . _Just’

结果我只需要将 ^? 替换为 . 并将 Lens' 更改为 Traversal'

instPublicIP' :: Traversal' Instance (Maybe Text)
instPublicIP' = insNetworkInterfaces . ix 0 . iniAssociation . _Just . iniaPublicIP