我很难阅读Control.Lens.Wrapped模块中的类型,而且我没有找到关于它的其他内容或它显然基于的newtype
库。特别是我想知道在保留newtype
封装器时我可以做些什么。例如,假设我有两个列在Data.Monoid.Sum
包装器中的列表。有没有什么方法可以轻松++
列表并在Sum
包装器中找回新值?我想要一个单态地看起来像这样的函数:
canIdoThis :: ([a] -> [a] -> [a]) -> Sum [a] -> Sum [a] -> Sum [a]
这样我就可以做一些像
这样的事情canIdoThis (++) (Sum [1,2]) (Sum [3,4])
并获取Sum [1,2,3,4]
。 (当然,canIdoThis
也适用于Product [a]
等)
任何其他提示或只是对Control.Lens.Wrapped
可以做的所有善意的一般性记录都非常感激。
答案 0 :(得分:2)
不使用Wrapped
,但是:
import Data.Coercible
canIdoThis :: ([a] -> [a] -> [a]) -> Sum [a] -> Sum [a] -> Sum [a]
canIdoThis = coerce
你确定这些应该包含在Sum
中吗?默认情况下不会instance Num [a]
。