与 -XTypeApplications
在 GHC 8.0 中,您可以使用 @
显式指定类型前面的函数参数。它具体指定了哪些类型,尤其是当多个 @
有介绍吗?
最佳答案
如果您查看函数的类型
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']
在这种情况下,我们只需要指定
@[]
并说“这是一个 []
列表类型构造函数”,因为 GHC 推断 Char
来自列表元素,所以 @Char
这里可以省略。如果 GHC 能够推断出多态参数恰好先出现,您可以利用
-XPartialTypeSignatures
它允许您使用 _
在包括类型应用程序签名在内的类型签名中,告诉 GHC 只推断 [部分] 类型,以使事情不那么冗长。f @_ @[]
关于haskell - 你如何在 Haskell 中使用 TypeApplications?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40275080/