此函数应适用于Int列表和Integer列表:
myFunc :: [Integer] -> [Char]
myFunc x = if (sum x `mod` 2 ==1) then "odd" else "even"
Run Code Online (Sandbox Code Playgroud)
但它只适用于整数列表.
类型类提供了一种关于类型的通用方法(它们实际上是类型组).您可以使用类型类约束而不是显式类型Integer,如下所示:
myFunc :: Integral a => [a] -> String
myFunc x = if (even (sum x)) then "even" else "odd"
Run Code Online (Sandbox Code Playgroud)
这将做的是指定它是一个函数from [a]到String哪里a是一个类型变量,并且被约束为任何类型,只要它是Integral类型类的成员.以另一种说法是任何类型的,只要它有一个实例的Integral类型类.这意味着它具有为该特定类型指定的类型类的方法.
该Integral类型类是该类型的值是整数(即积分).
幸运的是,Int并Integer提供了一个实例Integral,所以我们可以使用它.