Haskell:提升镜头的正常功能

问题描述

我有一个包含各种内容的HashMap(值来自Aeson):

cs :: Hashmap Text Value
cs = fromList [("phone",String "+00"),("count",Number 1)]

我发现我可以使用Lenses尤其是lens-aeson轻松提取元素:

import Data.Aeson.Lens
import Data.Lens

phone :: Maybe Text
phone = preview (at "phone" . _Just . _String) cs

这很好。 但是,如何获取我作为Int的计数? 我尝试过:

count :: Maybe Int
count = preview (at "count" . _Just . _Number) cs

但这将返回Maybe Scientific。 我发现(在Data-Scientific中):

toBoundedInteger :: forall i. (Integral i,Bounded i) => Scientific -> Maybe i 

如何在上面的“预览”中提升toBoundedInteger作为镜头(或棱镜)的作用?

解决方法

使用folding

count :: Maybe Int
count = preview (at "count" . _Just . _Number . folding boundedInteger) cs

也有to,但它为您提供了Maybe的额外一层,您必须用join折叠起来:

count :: Maybe Int
count = preview (at "count" . _Just . _Number . to boundedInteger . to join) cs

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...