首页 > 解决方案 > 如何在纯脚本中使用镜头在 ADT 之间进行转换?

问题描述

这是代码是我想要完成的工作但简化的示例。我想从一种类型的包装记录映射到另一种:

import Prelude
import Data.Lens
import Data.String as String

newtype AsString = AsString { names :: Array String }
newtype AsSize   = AsSize   { names :: Array Int }

_names = lens _.names (_ { names = _ })

to_sizes :: AsString -> AsSize
to_sizes (AsString s) = AsSize $ over (_names <<< traversed) String.length s

我如何只对镜头做同样的事情而不先打开记录?

当使用像lens (\(AsString s) -> s) (const AsString)原始类型这样的镜头时,我猜它期望结果是原始类型?

标签: purescriptlenses

解决方案


我想我通过实验找到了答案:

import Prelude
import Data.Lens
import Data.String as String

newtype AsString = AsString { names :: Array String }
newtype AsSize   = AsSize   { names :: Array Int }

_ToSize = lens (\(AsString s) -> s) (const AsSize)
_names  = lens _.names (_ { names = _ })

to_sizes :: AsString -> AsSize
to_sizes s = over (_ToSize <<< _names <<< traversed) String.length s

似乎将(const AsSize)原始记录“镜像”到新类型中。


推荐阅读