0

我想实现一个具有从给定 T 类型转换的函数 conv 的类。伪代码(不编译)如下所示:

data T a b c d  = List [a] | Tup1 a | Tup2 a b | Tup3 a b c deriving (Show)

class ConvT t where
  conv :: T a b c d -> t

instance ConvT [a] where
  conv (List x) = x

instance ConvT (a,b) where
  conv (Tup2 a b) = (a,b)

我怎样才能做到这一点?请注意,我不打算在生产中使用它——我只是想更多地了解 Haskell 类型系统。

4

2 回答 2

0

你的 typeclass 承诺你可以转换(T a b c d)t, 对于任何类型a b c d t。但是实例声明仅在类型之间存在某种对应关系时才有效。例如,这种List情况仅在tis时才有效[a],因此它不是您定义的类型类的有效实例。

我不是 Haskell 专家,但我认为这是不可能的,因为没有办法为conv.

于 2013-10-22T00:24:55.443 回答
0

首先,请注意这没有多大意义,因为您正在尝试定义一系列函数,每个函数都是固有的部分。它可以完成,它只需要扩展。

解决方案一:MPTC

class ConvT a b c d t where
  conv :: T a b c d -> t

instance ConvT a b c d [a] where
  conv (List x) = x

instance ConvT a b c d (a,b) where
  conv (Tup2 a b) = (a,b)

解决方案2:约束种类和类型族。

class ConvT t where
  type ConvC t a b c d :: Constraint
  conv :: ConvC t a b c d => T a b c d -> t

instance ConvT [a] where
  type ConvC [a] a' b c d = a ~ a'
  conv (List x) = x

instance ConvT (a,b) where
  type ConvC (a,b) a' b' c d = (a ~ a', b ~ b')
  conv (Tup2 a b) = (a,b)

注意:此代码未经测试,但可以理解。另外,不要这样做。

于 2013-10-22T01:09:23.250 回答