Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
类型类定义中类型的解构(Haskell)_Haskell_Typeclass - Fatal编程技术网

类型类定义中类型的解构(Haskell)

类型类定义中类型的解构(Haskell),haskell,typeclass,Haskell,Typeclass,我不确定这个标题是否具有足够的描述性,但我对Haskell不是很有经验。我想为两个参数类型构造函数创建一个typeclass,它取决于构造函数参数化的类型,如 class MyTypeclass (ctor a b) where funct :: (ctor a b) -> a (假设ctor::*->*->*,a:*,b::*)并且假设我有一个 data Pair a b = Pair a b 能够做像这样的事情 instance MyTypeclass (Pair a b) w

我不确定这个标题是否具有足够的描述性,但我对Haskell不是很有经验。我想为两个参数类型构造函数创建一个typeclass,它取决于构造函数参数化的类型,如

class MyTypeclass (ctor a b) where
  funct :: (ctor a b) -> a
(假设
ctor::*->*->*
a:*
b::*
)并且假设我有一个

data Pair a b = Pair a b
能够做像这样的事情

instance MyTypeclass (Pair a b) where
  funct :: Pair a b -> a
  funct (Pair x _) = x

如果没有多个参数类型类(因为它太强大了——我只想解构我的类型类被参数化的类型),是否可能呢?

是的,您可以使用所谓的“构造函数类”来获取更高级的类型:

class C ctor where
    funct :: ctor a b -> a

instance C Pair where
    funct (Pair x _) = x

instance C (,) where
    funct = fst     -- (a,b) -> a

谢谢它起作用了。但是我非常关心在那里发生的类型推断的数量——我如何用两个构造函数类生成两个参数的typeclass?我需要一种方法来指定哪种类型来自何处。我不确定是否理解您的顾虑-但请记住:类变量(此处
ctor
)必须出现在每个类函数签名中,并且必须应用于正确数量的类型参数。因此,所有类型都是通过输入固定的。那么更简单的问题是:你能在
实例C对中给出
funct
的显式类型签名吗?当然,只要在类memeber的类型符号中用
对替换
ctor
。好的,我想现在我或多或少理解了:)。