我是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?
1条答案
按热度按时间ergxz8rk1#
您的光学元件是
Fold Object Int
,而不是Traversal' Object Int
。如果您将类型签名写为:字符串
然后它将进行类型检查。
潜在的问题是,
to f
产生的是Getter
,而不是Traversal'
,当你用遍历(如ix "at"
)和getter(如to timeComponent
)组成一个optic时,你会得到一个fold。