当前位置: 首页 > 知识库问答 >
问题:

没有方法的类型类,用作约束:它们得到字典了吗?

牟正真
2023-03-14

如果我使用typeclass来重载方法,那是在“字典传递样式”中实现的。也就是说,该方法获得一个额外的参数(在surface Haskell中没有出现);为了解决重载问题,该方法根据其“适当”参数的类型查找字典;并从字典中提取方法实现。如本q中所述。

但是没有方法的类型类呢?它们可以用作约束条件。有他们的字典吗?里面包含什么?

具体示例如下:

module M  where

class C a             -- no methods
                      -- no instances in module M
f :: C a => a -> Bool
f x = blah

GHC将surface Haskell转换为内部表示形式:SystemFC,它在每个函数应用程序上都具有aot显式类型签名。(这些应用程序必须包括应用到一个类的字典。)我试图理解所有与类型相关的类和实例decl组件在词典中的位置;弄清楚fc中的一个术语是如何得到与原始haskell等价的表示的。那么我就不明白[没有方法的类型类]是如何适应的。因为那些类在surface Haskell中不能直接作为术语出现,而只能作为约束出现。那么它必须是这样一个类的dictionar(ies),在术语级别上表示它。

如果你要问这是要去哪里的话:fc中似乎有一个限制,它不能表示函数依赖关系。与无法生成类型级证据有关。那么我想了解这种限制是如何产生的/基金不能(或目前没有)代表呢?

共有1个答案

章城
2023-03-14

有没有[没有方法的类型类]的字典?里面包含什么?

是的,有一本没有字段的字典。

比较:

class Monoid a where
    mempty :: a
    mappend :: a -> a -> a
data DictMonoid a = DictMonoid a (a -> a -> a)

class C a
data DictC a = DictC
class Semigroup a => Monoid a where mempty :: a
data DictMonoid1 a = DictMonoid1 (DictSemigroup a) a
data DictMonoid2 a = DictMonoid2 a (DictSemigroup a)
class (A a, B a) => C a
data DictC1 a = DictC1 (DictA a) (DictB a)
data DictC2 a = DictC2 (DictB a) (DictA a)

你能做些什么来区分它们之间的区别呢?什么都没有。

对于带有约束的无方法类型类实例:同样,约束在字典中的位置?

无处可去。它们成为调用方必须提供才能接收字典的参数。当然,所提供的词典的特定字段可以被新词典关闭。示例:

class Ord a where compare :: a -> a -> Ordering
data DictOrd a where DictOrd (a -> a -> Ordering)

instance (Ord a, Ord b) => Ord (a, b) where
    compare (a,b) (a',b') = compare a a' <> compare b b'
instanceOrdTuple :: DictOrd a -> DictOrd b -> DictOrd (a,b)
instanceOrdTuple (DictOrd comparea) (DictOrd compareb)
    = DictOrd $ \(a,b) (a',b') -> comparea a a' <> compareb b b'
class A a where whateverA :: a -> Int
class B a where whateverB :: Int -> a
class C a
data DictA a = DictA (a -> Int)
data DictB a = DictB (Int -> a)
data DictC a = DictC

instance (A a, B a) => C [a]
instanceCList :: DictA a -> DictB a -> DictC [a]
instanceCList (DictA whateverAa) (DictB whateverBa) = DictC
 类似资料:
  • 泛型的类型约束 swapTwoValues(_:_:)函数和Stack类型可以用于任意类型. 但是, 有时在用于泛型函数的类型和泛型类型上, 强制其遵循特定的类型约束很有用. 类型约束指出一个类型形式参数必须继承自特定类, 或者遵循一个特定的协议、组合协议. 例如, Swift的Dictionary类型在可以用于字典中键的类型上设置了一个限制. 如字典中描述的一样,字典键的类型必须是可哈希的. 也

  • 我试图定义一个返回数组的方法(称为“range”)。我传递两个整数,比如m和n,它返回一个长度数组(n-m),如下表所示:隐式地,我假设n大于m。但我想明确地强加这个条件。有没有办法把这种条件强加给方法的论证?

  • 问题内容: 我试图弄清楚如何为通用类(在Swift中)实现类型约束,它将通用类型限制为仅数字类型。例如Double,Int等,但不是字符串。谢谢你的帮助。 问题答案: 您可以使用尖括号为通用类(对函数使用相同的语法)指定类型约束(使用类和协议): 要在单个类型上指定多个需求,请使用子句: 但是,您似乎无法在泛型参数子句中指定可选要求,因此一种可行的解决方案是创建一个协议,使所有数字类型都通过扩展来

  • 销关节 cpPinJoint *cpPinJointAlloc(void) cpPinJoint *cpPinJointInit(cpPinJoint *joint, cpBody *a, cpBody *b, cpVect anchr1, cpVect anchr2) cpConstraint *cpPinJointNew(cpBody *a, cpBody *b, cpVect anchr1,

  • 本文向大家介绍PHP类型约束用法示例,包括了PHP类型约束用法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP类型约束用法。分享给大家供大家参考,具体如下: 在强类型语言中,类型约束是语法上的要求,即定义一个变量的时候,必须指定类型,并以后也只能存储该类型数据; php是弱类型,其特点是无需为变量指定类型,而且在其后也可以存储任何类型,不过在php的新语法中,在某些特定场合,针对