我有一些代码使用makeIso
包中的lens
:
newtype Foo = Foo Integer
makeIso Foo'
incrementFoo :: Foo -> Foo
incrementFoo = foo +~ 1
现在我想将此代码用于lens
包的4.3版本。
此版本缺少makeIso
,更改日志显示:
已移除
makeIsos
,转而使用makePrisms
和makeLenses
。在适当的时候,这些函数中的每一个都将构造Isos
。
因为从来没有makeIsos
这样的功能,我认为这是一个拼写错误,他们的意思是makeIso
。因此,我尝试将makeIso
替换为makeLenses
,但这不会创建foo Iso
。
替换makeIso
的正确方法是什么?
感谢您的帮助
答案 0 :(得分:4)
使用下划线定义访问者:
{-# LANGUAGE TemplateHaskell #-}
import Control.Lens
newtype Foo = Foo { _getFoo :: Integer } deriving Show
$(makeLenses ''Foo)
这将创建一个getFoo
iso:
getFoo :: (Profunctor p, Functor f) => p Integer (f Integer) -> p Foo (f Foo)