haskell 无法从“to”的用法推导出(逆变f)

0yg35tkg  于 2023-11-18  发布在  其他
关注(0)|答案(1)|浏览(119)

我是Haskell的新手,我正在尝试transform我从下面的Traffic中获得的值

startedAt :: Traversal' Object Int
startedAt = ix "at" 
          . (_Integral 
            `failing`  _String . to timeComponent._Right 
            `failing` _String ._Integral)

timeComponent :: Text -> Either String Int
timeComponent t = ...

字符串
我得到这个错误

Could not deduce (Contravariant f) arising from a use of ‘to’
      from the context: Applicative f
        bound by the type signature for:
                   startedAt :: Traversal' Object Int
        at SomeModule/Optics.hs:80:1-34
      Possible fix:
        add (Contravariant f) to the context of
          the type signature for:
            startedAt :: Traversal' Object Int
    • In the first argument of ‘(.)’, namely ‘to timeComponent’
      In the second argument of ‘(.)’, namely ‘to timeComponent . _Right’
      In the second argument of ‘(.)’, namely
        ‘to timeComponent . _Right’


在代码的其他部分,开发人员已经在做

doSomething :: Object -> First Int
doSomething l = First $ <same-code-as-above>


正如你所看到的,当我内联它时,它可以工作,但是当我将它移动到一个单独的Optic时,它会抛出错误。
Ps:还有一个疑问,什么时候我应该给予类型作为Traffic而不是Prism?

ergxz8rk

ergxz8rk1#

您的光学元件是Fold Object Int,而不是Traversal' Object Int。如果您将类型签名写为:

startedAt :: Fold Object Int

字符串
然后它将进行类型检查。
潜在的问题是,to f产生的是Getter,而不是Traversal',当你用遍历(如ix "at")和getter(如to timeComponent)组成一个optic时,你会得到一个fold。

相关问题