2012-10-06 37 views
3

我有一个类型类的参数变量,我想表示任何数字类型(Float,Integer,Double等)。参数变量类型

我如何在类型和实例中声明这个?

回答

7

如果你指的类本身的类型参数,你可以添加一个约束到类定义的范围内:

class (Num a) => Foo a where 
    -- stuff 

在另一方面,如果它是在一个函数的类型ISN参数“T类参数,那么您可以在通常的方式添加约束条件:

class Foo a where 
    foo :: (Num b) => a -> b -> b 

如果你想将其限制在只有某些特定类型的,这是不是真的有可能 - 型类是‘开放式’,即,你总是可以添加实例。你可以做的最好的事情是拥有你自己的课程(FooNumbers等),只写你想要的实例,然后需要它而不是Num。但这通常没有帮助。

+0

最后的警告是对班级(数字a)=>选项的警告吗? –

+0

@peroni_santo:不,它是关于试图将它限制为少数特定类型而不是“具有'Num'实例的任何东西”。我在代码中给出的两个例子都很好。 –