我正在尝试使用一个外部库,它提供了如下的参数化类型:
data ParametricType a = TypeConstructor a
我有一个类型类,类似于:
class GetsString a where
getString :: a -> String
如果ParametricType的a
是一个特定的类型,我想执行一些代码。
data HoldsString = HoldsString String
instance GetsString (ParametricType HoldsString) where
getString (TypeConstructor (HoldsString str)) = str
Illegal instance declaration for‘GetsString (ParametricType HoldsString)’(All instance types must be of the form (T a1 ... an)
的错误
并且我已经尝试了对类型进行模式匹配:
instance GetsString (ParametricType a) where
getString (TypeConstructor (HoldsString str)) = str
我收到了Couldn't match expected type ‘a’ with actual type ‘HoldsString’‘a’ is a rigid type variable bound by the instance declaration
。
有没有办法做到这一点,或者我在概念上走错了路?
1条答案
按热度按时间vlju58qv1#
你只是缺少了
FlexibleInstances
扩展名。把{-# LANGUAGE FlexibleInstances #-}
放在文件的顶部,或者如果你是直接输入GHCi的话,做:set -XFlexibleInstances
,这样你的第一次尝试就可以成功了。