Haskell 中类型参数的正确类型签名
Right type signature for type parameter in Haskell
我有两种数据类型,想写一个 class returns 来自这些数据类型的数据:
data D1 a = Da1 a | Db1 a
data D2 a = Da2 a | Db2 a
class D a where
extract :: ??? a -> a
instance D (D1 a) where
extract (Da1 a) = a
extract (Db1 a) = a
instance D (D2 a) where
extract (Da2 a) = a
extract (Db2 a) = a
如果我只有一个类型 D1 或 D2 我可以在类型签名中命名它,但是在有多种可能性的情况下我该怎么办?这甚至可能吗?
您需要创建 D
的 D1
和 D2
个实例,而不是 D1 a
和 D2 a
。然后你可以在 a
上量化 extract
并使 extract
return 从 D
中得到 a
所有 a
.
因为这可能不是很清楚(抱歉):
class D d where
-- `d` is the type constructor that's an instance of `D` (i.e. `D1` or
-- `D2`) and `a` is a new type variable that can be any possible type
extract :: d a -> a
instance D D1 where
extract (Da1 a) = a
extract (Db1 a) = a
我有两种数据类型,想写一个 class returns 来自这些数据类型的数据:
data D1 a = Da1 a | Db1 a
data D2 a = Da2 a | Db2 a
class D a where
extract :: ??? a -> a
instance D (D1 a) where
extract (Da1 a) = a
extract (Db1 a) = a
instance D (D2 a) where
extract (Da2 a) = a
extract (Db2 a) = a
如果我只有一个类型 D1 或 D2 我可以在类型签名中命名它,但是在有多种可能性的情况下我该怎么办?这甚至可能吗?
您需要创建 D
的 D1
和 D2
个实例,而不是 D1 a
和 D2 a
。然后你可以在 a
上量化 extract
并使 extract
return 从 D
中得到 a
所有 a
.
因为这可能不是很清楚(抱歉):
class D d where
-- `d` is the type constructor that's an instance of `D` (i.e. `D1` or
-- `D2`) and `a` is a new type variable that can be any possible type
extract :: d a -> a
instance D D1 where
extract (Da1 a) = a
extract (Db1 a) = a