gpt4 book ai didi

haskell - 实例声明中类型变量的顺序

转载 作者:行者123 更新时间:2023-12-01 22:17:14 24 4
gpt4 key购买 nike

假设我有一个类型 T a b 并且我想写一个实例声明,例如Functor 的实例声明,范围在 anot b 之间。如果不定义 newtype 是否可行?

我读了What is the rule of the order of multiple type variables in haskell?这让我相信这是不可能的,但这对我来说似乎完全是武断的。

我希望的是这样的:

instance Functor (T * b)

最佳答案

这不是任意的。这就是 Hindley-Milner 类型推断如何与更高级的类型和柯里化(Currying)类型构造函数应用程序一起工作。类型变量的统一基于生成类型构造函数的概念。即如果(f a) ~ (g b),则f ~ ga ~ b,其中~ 是类型相等。

让我们将其应用于 (fmap f someT) 等表达式的统一,对于 someT::T a b。我将从提供除 someT 新类型变量之外的所有内容开始,以按照统一的方式工作。

someT :: T a b
fmap :: (c -> d) -> f c -> f d
f :: e

由于 fmap 被提供为 f 作为第一个参数,我们统一了 (c -> d) ~ e。所以..

fmap f :: f c -> f d
someT :: T a b

这就是生成性发挥作用的地方。从这里,我们看到 (f c) ~ (T a b)。为了清楚起见,让我添加一些额外的括号:(f c) ~ ((T a) b)。这就是类型构造函数在 Haskell 中的工作方式——它们以与术语级函数相同的方式柯里化(Currying)。通过生成性,f ~ (T a)c ~ b

然后从那开始:

fmap f someT :: T a d

因此 Functor 实例必须只对 T 类型的第二个类型参数进行操作是必然的。

当然,这一切都可以追溯到类型推断算法。您可以放弃 Hindley-Milner 或 curried 类型构造函数来使事情以不同的方式工作。但结果与 Haskell 的区别不仅仅在于允许几个 Haskell 不允许的实例。

关于haskell - 实例声明中类型变量的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44134833/

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