这是关于Haskell中多个调度的问题.
下面我使用术语"符合[类类]"来表示"类型是[类类]的实例",因为类型类通常类似于接口,所以直观地想到一个具体的东西,比如实际的Int值由于其类型实现了属于该接口/类型类所需的任何内容,因此与接口/类型类"兼容".
考虑想使一个单一的幂函数,将工作无论是调用的例子Floating论证,Num,Integral或什么的,它的工作原理是使用由参数类型实现的类型等级来选择预先存在的幂函数打电话.
该函数(^)具有类型(^) :: (Integral b, Num a) => a -> b -> a,函数(**)具有类型(**) :: Floating a => a -> a -> a.
假设我想创建一个my_pow接受Num兼容的第一个参数和一个Num兼容的第二个参数的函数.
如果两个参数都Floating符合,那么它将调用(**); 如果第二个参数仅仅Integral符合,它将调用(^); 和任何其他情况将给出模式匹配错误.
我天真的第一次尝试是像类值构造函数一样处理类型类,并尝试在函数定义中进行模式匹配:
my_pow :: (Num a, Num b) => a -> b -> a
my_pow (Floating x) (Floating y) = x ** y …Run Code Online (Sandbox Code Playgroud)