haskell - 使数据类型成为 Functor 的实例以映射到参数类型的字段
问题描述
跟进这个关于Learn You a Haskell for Great Good 的问题。
作者,在第8章末尾声明了这个数据类型(稍微简化了,希望没问题)
data Barry t k p = BarryV p (t k) deriving (Show)
然后使它成为一个实例Functor
instance Functor (Barry a b) where
fmap f (BarryV x y) = BarryV (f x) y
然后结束
我们去吧!我们刚刚映射
f
了第一个字段。
是的。首先。所以我的问题是:如果我想映射第二个字段怎么办?
实际上,第二个字段不能是 , Int
,Char
等简单的类型Float
;它必须是可以作为应用于具体类型的类型构造函数获得的类型(斜体文本与“参数类型”相同,对吗?不,它是参数化类型),例如Just 3
, Right "hello"
, "hello"
, [1..10]
, and很快; 因此映射第二个字段和映射第二个字段的内容似乎不同。
我真的很困惑,但我想最后一段已经足够我展示了。
解决方案
最简单的方法是使用您的类型创建一个函数作为执行此操作的具体类型:
mymap :: (t1 k1 -> t2 k2) -> Barry t1 k1 p -> Barry t2 k2 p
mymap f (BarryV x y) = BarryV x (f y)
如果你真的想用现有的类型类来做,你可能会通过包装器类型将足够的转换链接在一起,Product
或者Compose
让类似的东西Bifunctor
弹出,但我认为在这种情况下不值得这样做。
推荐阅读
- java - JNI:从 Java 调用 C# 方法
- javascript - 多会话视频广播的 Tokbox 替代方案
- r - R: Picking values from matrix by indice matrix
- vue.js - Vue Cli 根路由器仅在工作
- hiveql - hive 中分析函数的错误结果
- python - 在 python 中从单元测试用例为 reqparse.RequestParser 发送参数
- python - Tensorflow InvalidArgumentError:通过 Lambda 层对输入进行切片后的形状不兼容
- vuejs2 - 为什么我的 v-if 不起作用
- operating-system - h/w 和 s/w 中断的实现区别
- unit-testing - 失败的道具类型:提供给“组件”的“对象”类型的无效道具“iconBack”,测试文件中的预期“数字”