在函数内部使用haskell类

时间:2018-05-01 19:24:12

标签: haskell types typeclass

想象一下有一些课程:

class Foo a where
  g :: b -> a
  f :: a -> b

我希望能够编写以下函数:

h :: a -> a
h = f . g

但要做到这一点,我需要一些方法来指定我正在使用的Foo的确切实例。有没有办法做这个类似于Rust如何使用特征?我非常肯定我可以使用模板haskell每次都使用提供的类来构建这个函数,但是如果可能的话我会喜欢这个。

1 个答案:

答案 0 :(得分:3)

如果您希望h在内部决定使用哪个实例,只需提供注释即可消除歧义。如果您想选择b ~ Int

,请说
h :: Foo a => a -> a
h = f . (g :: Int -> a)

(我想Foo在您的实际课程中需要另一个参数b,但在这种情况下,可以根据需要调整此方法。

如果您需要h来电者来选择实例,而不是h本身,则可以使用AmbiguousTypesTypeApplications(和ScopedTypeVariables)。

h :: forall b a . Foo a => a -> a
h = f . (g :: b -> a)

稍后,您可以拨打h,例如h @ Int,选择b ~ Int