gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 23:45:15 26 4
gpt4 key购买 nike

-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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com