Haskell中Pair数据类型的Applicative实例实现报错求助
问题分析与解决
你的代码里有两个核心问题导致编译器报错:
1. pure函数里的a是未绑定的值
你在pure x = Pair a x里用的a是类型变量(对应instance Applicative (Pair a)里的a),它代表的是一种类型,不是该类型的具体值。编译器不知道你要拿什么值来填充Pair的第一个位置,所以报错说a不在作用域中。
2. <*>里的加法缺少类型约束
Pair a f <*> Pair a' x = Pair (a + a') (f x)里的+操作要求a属于Num类型,但你的实例声明没加这个约束,编译器无法确认a支持加法运算。
修正方案(两种可选)
方案一:基于Monoid(更通用)
如果想让Pair的第一个元素支持任意可组合的类型(不止数值类型),可以用Monoid类型类,它提供了单位元(mempty)和组合操作(`<>):
import Data.Monoid data Pair a b = Pair a b deriving (Show) instance Functor (Pair a) where fmap f (Pair a b) = Pair a (f b) instance Monoid a => Applicative (Pair a) where pure x = Pair mempty x -- 用Monoid的单位元作为第一个元素的默认值 Pair a f <*> Pair a' x = Pair (a <> a') (f x) -- 用Monoid的组合操作合并第一个元素
方案二:基于Num(符合你的加法逻辑)
如果只想针对支持加法的数值类型,给实例加上Num a约束,并用0作为pure的默认值:
data Pair a b = Pair a b deriving (Show) instance Functor (Pair a) where fmap f (Pair a b) = Pair a (f b) instance Num a => Applicative (Pair a) where pure x = Pair 0 x -- 用Num类型的0作为默认第一个元素 Pair a f <*> Pair a' x = Pair (a + a') (f x)
内容的提问来源于stack exchange,提问作者ZFunk
相关产品推荐
相关产品推荐

