gpt4 book ai didi

haskell - `undefined` 的类型签名在 Haskell 中是什么意思?

转载 作者:行者123 更新时间:2023-12-04 05:18:44 26 4
gpt4 key购买 nike

我是 Haskell 的初学者,我被 undefined 吓了一跳函数的类型签名。

我期待一些更简单的东西,但我在 Hackage 上找到了这个:

undefined :: forall (r :: RuntimeRep). forall (a :: TYPE r). HasCallStack => a

A special case of error. It is expected that compilers will recognize this and insert error messages which are more appropriate to the context in which undefined appears.



你能解释一下这个签名是什么意思吗?

谢谢!

最佳答案

对于初学者需要知道的所有方面,签名很简单

undefined :: a

这意味着,与往常一样, a 的类型变量(即任何小写字母)是 universally quantified ,也可以明确表示:
{-# LANGUAGE ExplicitForall #-}
undefined :: forall a. a

...或者,因为我更喜欢写它
{-# LANGUAGE ExplicitForall, UnicodeSyntax #-}
undefined :: ∀ a. a

量化被推断为针对所有类型,即所有类型为 * 的事物(读作:“type”,更准确地说是提升类型——提升意味着它可以是懒惰的重击)。因此,您可以使用 undefined在任何表达式中,无论需要什么类型。

现在, undefined当然是一个“部分函数”之类的东西,基本上是一个零参数的函数,它在任何地方都没有定义。 (FTR,它不是函数,因为根据定义,函数具有参数[s]。)
您希望在实际评估时获得有用的错误消息,但 GHC 默认情况下不会为所有内容生成调用堆栈(出于性能原因),因此过去的情况是错误消息几乎完全无用.这就是 HasCallStack 进来:这是一个约束,它基本上告诉了某些代码可能会在其中发生的上下文 undefined它应该注意它发生的地方,以便错误消息实际显示出来。所以,
undefined :: ∀ a. HasCallStack => a
HasCallStack 有点令人困惑。出现在 ∀ a 之后– 这与 a 没有任何关系但在 undefined 的上下文中将会被使用。只是,签名的形式总是

标识符::量词。约束 => 类型

HasCallStack是一个约束,这就是它出现在中间的原因。 (更常见的是,约束实际上适用于您已量化的类型变量之一。)

最后,这个 RunTimeRep东西是关于轻浮多态性的。我自己也不是很明白,但在 Why is the undefined function levity-polymorphic when using it with unboxed types? 中讨论过。

关于haskell - `undefined` 的类型签名在 Haskell 中是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56311510/

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