【发布时间】:2020-12-11 17:45:11
【问题描述】:
我们以这些函数的类型为例:
:t traverse
traverse
:: (Applicative f, Traversable t) => (a -> f b) -> t a -> f (t b)
:t id
id :: a -> a
它们没有具体类型,但有泛型类型参数:
a、f、b、t(如果他们调用的不是泛型类型参数请纠正我)
如果我以这种方式将id 和traverse 组合在一起,
:t traverse id [Just 1, Just 2, Nothing]
traverse id [Just 1, Just 2, Nothing] :: Num b => Maybe [b]
Haskell 现在可以为类型变量a、f、b、t 绑定一些具体类型。
t = []
a = Maybe bb
f = Maybe
b = Num bb => bb
下面我手动推断参数的类型和映射,Haskell 中有没有任何方法或工具可以自动执行此操作,以便在示例中采用一些组合部分(id 和traverse),提取它们一般的类型签名,并在输出时生成从泛型类型参数名称到具体推断类型的映射?
另请参阅此处的第一个示例:https://wiki.haskell.org/Type_inference
对于表达式“map ord”,了解 Haskell 如何找到实际类型与名称的绑定。
所以当我们单独查看函数时,我们只有名称a、f、b、t。但随后我们组合这些函数并提供一些额外的信息,例如[Just 1, Just 2, Nothing],并将名称a、f、b、t 映射到具体类型。
我想自动捕捉并显示这个映射。
【问题讨论】:
-
我已经投票决定重新提出这个问题。我不知道你是否会得到一个满意的答案,但我很清楚你在问什么:自动打印出类型变量的替换编译器在实例化多态定义的类型时在类型检查期间进行推断。即,给定
f :: forall x1…xn. t类型变量x1…xn和类型t,以及一个包含f的表达式,这将打印为x1…@ 选择的所有值(类型为Type) 987654354@。您可以在 GHC 标志-ddump-tc、-ddump-tc-ast或-ddump-tc-trace的输出中找到所需的信息。 -
如果我关闭它时出错,请纠正我。
-
@JonPurdy,我错误地投票支持重新打开这个问题,而没有看到您的评论来自 13 小时前,而 Will Ness 仅在几分钟前关闭了这个问题,所以您可能同意(我同意) 与 Will 标记的欺骗。
-
@WillNess,我认为你没有错,即使我在问 那个 问题时有偏见,正是为了欺骗这个(可惜没有金色徽章创建一个较旧的问题被标记为重复的新问题:P)。但乔恩可能在这个问题中看到了我看不到的另一种含义。
-
@Enlico:您的问题显示了如何获取子表达式的类型;为了回答这个问题,您需要将该结果并手动将其与原始多态类型统一以获得所需的结果,例如 {
f↦Maybe,t↦[],a↦Maybe b0,b↦b0}。这适用于函数,尽管对于更复杂的子项来说不是那么好。这当然是一种到达那里的方法,只是不完全是我认为的要求——即替换。
标签: haskell types type-inference parametric-polymorphism