关于构造满足(Num a, Enum a) => [a]类型的Haskell表达式/函数的咨询
如何构造满足
(Num a, Enum a) => [a]类型的Haskell表达式或无参函数? 嘿,这个问题挺有意思的!当然可以构造出这种类型的表达式/函数,而且完全不需要输入参数——Haskell的类型类系统正好支持这种场景,咱们来看看几种实用的实现方式:
直接用枚举语法生成无限列表
这是最简单的实现方式,Haskell的[x..]语法会调用Enum类型类的enumFrom方法,而x作为数值字面量又满足Num约束,所以整体类型正好匹配要求:[1..] -- 生成从1开始的无限递增列表:1,2,3,4,...你可以直接在GHCi里输入这个表达式验证,它的类型会被自动推断为
(Num a, Enum a) => [a]。带步长的枚举列表
类似地,带步长的枚举语法[x,y..]也符合要求,x和y作为数值满足Num约束,同时语法依赖Enum的enumFromThen方法:[0,2..] -- 生成从0开始、步长为2的无限偶数列表:0,2,4,6,...自定义无参函数封装
如果你想把逻辑封装成命名函数,直接定义即可,类型签名可以显式声明(也可以让编译器自动推断):infiniteNaturalNumbers :: (Num a, Enum a) => [a] infiniteNaturalNumbers = [1..] cyclicTriple :: (Num a, Enum a) => [a] cyclicTriple = cycle [1,2,3] -- 循环重复1、2、3的无限列表这里
cycle [1,2,3]的类型也符合要求,因为[1,2,3]本身需要Num和Enum约束,cycle函数会完整保留原列表的类型约束。
为什么不需要输入参数?
Haskell的类型类约束允许我们在没有外部输入的情况下,利用类型类提供的能力(比如Enum的枚举方法、Num的数值字面量支持)构造值。只要表达式本身能推导出所需的所有约束,就完全不需要额外参数。
比如[1..]中,1属于Num类型类的实例,..语法触发Enum类型类的方法,编译器会自动补上(Num a, Enum a)的约束,正好匹配你需要的类型。
备注:内容来源于stack exchange,提问作者Slamalama
相关产品推荐
相关产品推荐

