【问题标题】:Deconstruction of type in typeclass definition (Haskell)类型类定义中类型的解构(Haskell)
【发布时间】:2013-07-05 23:19:33
【问题描述】:

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

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

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

【问题讨论】:

    标签: haskell typeclass


    【解决方案1】:

    是的,您可以使用所谓的“构造函数类”,它采用更高种类的类型:

    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
    

    【讨论】:

    • 谢谢!有用。但我很担心那里发生的类型推断的数量——我怎么能用两个构造函数类来制作双参数类型类?我需要一种方法来指定哪种类型来自哪里。
    • 不确定我是否理解您的担忧 - 但请记住:类变量(此处为 ctor)必须出现在每个类函数签名中,并且必须应用于正确数量的类型参数。因此,所有类型通过输入都是固定的。
    • 那么更简单的问题:你能在instance C Pair where 中给出funct 的显式类型签名吗?
    • 当然,只需在类成员的类型签名中将ctor 替换为Pair
    • 好的,我想现在我或多或少地理解了它:)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多