在-XTypeApplications
GHC 8.0 中,您可以使用@
前面的函数参数显式指定类型。它具体指定了哪些类型,尤其是在@
引入了几种类型时?
问问题
5009 次
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 回答