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