“从环境中获取” 就像开玩笑说的:“你叫函数‘Just F***ing Get It(JFGI)’”,意思是:函数应该自动从类型系统或上下文中获得这个证明,不需要人工额外提供。
类型类其实就是隐式参数
在Haskell和Scala中,类型类实际上是“按类型索引的隐式参数”。
也就是说,类型类是类型本身,也是一种“隐式传递的参数”,编译器自动查找符合约束的实例。
集中声明,广泛适用 Concepts 或 Type Classes 允许你把类型的“事实”(比如“类型T支持比较”)集中声明在一个地方,程序其他地方只要写出这个约束,编译器自动知道这个类型满足条件,无需每处重复声明。
总结
概念和类型类是为了让代码更简洁、易用,减少样板代码(boilerplate)
它们是类型系统中的“全局约束”,你声明一次,所有地方都自动生效
让泛型编程更自然,更安全,错误更早发现
通过 Haskell 和 C++ 两种语言对比,进一步说明了**概念(Concepts)/类型类(Type Classes)**的实际用法,体现了它们如何表达类型的约束。
Haskell 例子解析:
-- 排序函数声明,要求类型 a 必须实现 Ord 类型类(有序)sort::Orda=>[a]->[a]-- Ord 类型类继承 Eq 类型类,定义了 <= 操作符classEqa=>Ordawhere(<=)::a->a->Bool-- Eq 类型类定义了 == 操作符classEqawhere(==)::a->a->Bool
Ord a => 是约束,表示排序函数只能用在实现了 Ord 的类型 a 上。
Ord 继承自 Eq,确保比较大小之前能比较相等。
这样写的好处是,只要类型实现了这些接口,函数就能使用,无需每次都传入比较函数。
C++ 例子解析:
template<typenameT>requires Ord<T>
list<T>sort(list<T>);template<typenameT>conceptboolOrd=requires(T a, T b){{ a <= b }->bool;// T类型必须支持 <= 并返回 bool// 这里可以添加更多约束};template<typenameT>conceptboolEq=requires(T a, T b){{ a == b }->bool;// T类型必须支持 == 并返回 bool};