19

-XTypeApplicationsGHC 8.0 中,您可以使用@前面的函数参数显式指定类型。它具体指定了哪些类型,尤其是在@引入了几种类型时?

4

1 回答 1

25

如果您查看函数的类型

elem :: (Foldable t, Eq a) => a -> t a -> Bool

我们看到它有两个多态变量,t并且a. 这些变量是@应用程序指定的类型。似乎在上下文中引入的变量(类型类约束所在的位置)会影响顺序,因此第一个@指定. t,第二个指定a. 在没有上下文变量的函数中

const :: a -> b -> a

顺序比较明显,a是第一,b第二。正如 Cactus 在上面的评论中提到的,您还可以使用显式 foralls 自己指定顺序。

myConst :: forall b a. a -> b -> a

现在第一个类型的应用程序将指定.b和第二个a.

您可能会遇到需要指定类型的问题,尤其是在使用重载字符串或列表时

elem c "abc...xyz" -- What string type is this?
elem c ['a' .. 'z'] -- What list constructor is this?

因此我们使用显式类型应用程序

elem @[] @Char c ['a' .. 'z']

在这种情况下,我们只需要指定@[]并说“这是一个[]列表类型构造函数”,因为 GHCChar从列表元素推断,所以@Char可以在这里省略。

如果多态参数 GHC 能够首先推断出,您可以利用-XPartialTypeSignatures它允许您_在类型签名中使用,包括类型应用程序签名,告诉 GHC 仅推断该类型的 [part of the],以使事情变得不那么冗长。

f @_ @[]
于 2016-10-27T02:20:52.437 回答