假设我有一个定义如下的数据类型:
data Register = Register { _reg_h :: Word8
, _reg_l :: Word8
}
makeLenses ''Register
现在,如果我想定义一个聚焦从 aRegister
到 a的镜头Word16
。这个函数应该如下所示:
refer :: Lens' Register Word16
refer = do h <- reg_h
l <- reg_l
return $ (fromEnum h `shiftL` 8) .&. fromEnum l
( Word8
, Word16
, shiftL
, and.&.
来自Data.Word
and Data.Bits
, 我RankNTypes
在源代码的开头启用了。)
但是,此代码根本不起作用。我想这可能是因为完整的Lens
类型定义有四个类型参数,这将比一个简单Lens'
的更复杂Monad
。
那么通过什么方式可以达到上述的效果呢?
谢谢。