想象一下有一些课程:
class Foo a where
g :: b -> a
f :: a -> b
我希望能够编写以下函数:
h :: a -> a
h = f . g
但要做到这一点,我需要一些方法来指定我正在使用的Foo的确切实例。有没有办法做这个类似于Rust如何使用特征?我非常肯定我可以使用模板haskell每次都使用提供的类来构建这个函数,但是如果可能的话我会喜欢这个。
答案 0 :(得分:3)
如果您希望h
在内部决定使用哪个实例,只需提供注释即可消除歧义。如果您想选择b ~ Int
h :: Foo a => a -> a
h = f . (g :: Int -> a)
(我想Foo
在您的实际课程中需要另一个参数b
,但在这种情况下,可以根据需要调整此方法。
如果您需要h
的来电者来选择实例,而不是h
本身,则可以使用AmbiguousTypes
和TypeApplications
(和ScopedTypeVariables
)。
h :: forall b a . Foo a => a -> a
h = f . (g :: b -> a)
稍后,您可以拨打h
,例如h @ Int
,选择b ~ Int
。