我做了一个测试fclabels的最小例子。使用镜头检索“权利”。来自Either值的值。为什么这会失败?我错过了包括什么吗?
module Label where
import Data.Label
import Data.Label.Base
test = get right (Right "test")
{- Will fail with this message:
Label.hs:5:12:
No instance for (Control.Arrow.ArrowZero Data.Label.Point.Total)
arising from a use of `right'
Possible fix:
add an instance declaration for
(Control.Arrow.ArrowZero Data.Label.Point.Total)
In the first argument of `get', namely `right'
In the expression: get right (Right "test")
In an equation for `test': test = get right (Right "test")
Failed, modules loaded: none.
-- Tested with fclabels-2.0.2
-}
答案 0 :(得分:2)
错误相当模糊,但当我们查看get
和right
的类型和文档时,它会变得更加清晰:
get :: (f :-> a) -> f -> a
type :-> f o = Lens Total f o
right :: (ArrowZero arr, ArrowApply arr, ArrowChoice arr)
=> Lens arr (Either a b -> Either a o) (b -> o)
-- Lens pointing to the right value in an Either. (Partial and polymorphic)
基本上,您使用的get
仅适用于总镜头,但right
不是全镜头,因为它不会起作用如果值是Left
。错误是说部分镜头要求载体类型为ArrowZero
,但总透镜不能这样做。
如果您在ghci
进行试验,则只需通过调用get right
即可获得此错误,而无需任何参数。
如果您将Data.Label
的导入更改为Data.Label.Partial
,那么您的代码就可以正常运行。 test
以Maybe String
类型结束。