首页 > 解决方案 > 使数据类型成为 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很快; 因此映射第二个字段和映射第二个字段的内容似乎不同。

我真的很困惑,但我想最后一段已经足够我展示了。

标签: haskellfunctional-programmingfunctor

解决方案


最简单的方法是使用您的类型创建一个函数作为执行此操作的具体类型:

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弹出,但我认为在这种情况下不值得这样做。


推荐阅读