我正在研究 GHC 中的函数重载有多强大。我编写了以下代码:
class F_third_arg a where
run_f :: (Integer, a) -> Integer
instance F_third_arg Integer where
run_f (_, x) = x
instance F_third_arg String where
run_f (x, _) = x
my_fun :: (F_third_arg a) => Integer -> (a -> Integer)
my_fun x = \a -> run_f(x, a)
main :: IO ()
main = putStrLn $ show( ((my_fun::Integer->(Integer->Integer)) 5) $ 6)
(是的,我需要 -XTypeSynonymInstances -XFlexibleInstances)而且我很惊讶编译器需要在调用附近的类型注释my_fun
。它适用于两个数字——推断这个注释有什么问题?开启这两个扩展的重载规则是什么?