haskell - 你如何在 Haskell 中使用 TypeApplications?

标签 haskell types ghc language-extension

-XTypeApplications在 GHC 8.0 中,您可以使用 @ 显式指定类型前面的函数参数。它具体指定了哪些类型,尤其是当多个 @有介绍吗?

最佳答案

如果您查看函数的类型

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

我们看到它有两个多态变量,ta .这些变量是@类型应用程序指定。似乎在上下文中引入的变量(类型类约束所在的位置)会影响顺序,因此第一个 @指定 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/

相关文章:

haskell - Haskell、Ocaml、Javascript 中的语句与表达式

list - 让 Haskell 中的递归

go - 使用类型取决于 bool 值的全局范围初始化结构

c# - 为什么这些除法方程的结果为零?

haskell - 名义类型角色和数据系列

scala - 有没有办法在 Scala 中编写这个 Haskell 代码?

java - 偶/奇 Java 测试

haskell - 如何在 Haskell 中将其更改为 while 循环?

haskell - 当范围内有多个字典时,GHC 会选择哪个字典?

haskell - 与fundeps捆绑约束