Haskell 如何";撰写;Iso&x27;s
这是我的类型:Haskell 如何";撰写;Iso&x27;s,haskell,haskell-lens,Haskell,Haskell Lens,这是我的类型: newtype SaneDate = SaneDate UniversalTime deriving (Show, Eq, Typeable, Generic) makeWrapped ''SaneDate 现在我需要这种类型的iso: reprBuild :: Iso' (Maybe UniversalTime) (Fist SaneDate) 我这样做: reprBuild = iso (\ t -> First (SaneDate <$>
newtype SaneDate = SaneDate UniversalTime
deriving (Show, Eq, Typeable, Generic)
makeWrapped ''SaneDate
现在我需要这种类型的iso:
reprBuild :: Iso' (Maybe UniversalTime) (Fist SaneDate)
我这样做:
reprBuild = iso
(\ t -> First (SaneDate <$> t) )
(\ sane_first -> fmap (^. _Wrapped) $ getFirst sane_first )
reprBuild=iso
(\t->First(SaneDate t))
(\sane_first->fmap(^._包装)$getFirst sane_first)
但我觉得我工作非常努力。有没有一种(较短的)方法可以将iso作为事物的组合来编写reprBuild
iso?使用:
It类型检查——没有执行其他测试。组合器允许您在任何函子上提升Iso
(在本例中,可能是函子):
我们还可以利用First
有一个Wrapped
实例这一事实来获得您想要的iso:
reprBuild :: Iso' (Maybe UniversalTime) (First SaneDate)
reprBuild = mapping _Unwrapped . _Unwrapped
您也可以使用强制同构:但这只适用于新类型的包装,并且需要ghc>=7.10。最新版本的lens
:
当然,这需要自7.10以来才可用的安全强制;为了向后兼容。好的,这将编译并通过测试。安全强制从7.8开始就存在了。镜头
在CPP中的边界是否过紧?
reprBuild' :: Iso' (Maybe UniversalTime) (Maybe SaneDate)
reprBuild' = mapping _Unwrapped
reprBuild :: Iso' (Maybe UniversalTime) (First SaneDate)
reprBuild = mapping _Unwrapped . _Unwrapped
reprBuild = coerced