使用' left'来自fclabels的镜头

时间:2014-10-14 20:55:07

标签: haskell lenses

我做了一个测试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
-}

1 个答案:

答案 0 :(得分:2)

错误相当模糊,但当我们查看getright的类型和文档时,它会变得更加清晰:

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,那么您的代码就可以正常运行。 testMaybe String类型结束。