haskell - 为什么我不能在任何地方都使用 undefined ?

标签 haskell functional-programming constraints typechecking

我以为我总是可以把 undefined在我还不知道该放什么的同一个地方,并且代码应该可以正常编译,只有在 undefined 的情况下才会在运行时发生错误实际上是评估的。
然而,就在这样做时,我开始写类似的东西

f = foldl undefined undefined undefined
在文件中,当我尝试加载文件时 GHCi 会出现此错误
source.hs:3:7: error:
    • Ambiguous type variable ‘t0’ arising from a use of ‘foldl’
      prevents the constraint ‘(Foldable t0)’ from being solved.
      Probable fix: use a type annotation to specify what ‘t0’ should be.
      These potential instances exist:
        instance Foldable (Either a) -- Defined in ‘Data.Foldable’
        instance Foldable Maybe -- Defined in ‘Data.Foldable’
        instance Foldable ((,) a) -- Defined in ‘Data.Foldable’
        ...plus one other
        ...plus 29 instances involving out-of-scope types
        (use -fprint-potential-instances to see them all)
    • In the expression: foldl undefined undefined undefined
      In an equation for ‘f’: f = foldl undefined undefined undefined
  |
3 | f = foldl undefined undefined undefined
  |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
我将其解释为“undefined 此处不进行类型检查”。
这种行为背后的原因是什么,哪些地方不能使用undefined作为临时占位符?

最佳答案

解释器不知道 f 的类型在 foldl :: Foldable f => (a -> b -> a) -> a -> f b -> a使用,因此错误。这很重要,因为 f这里决定了 foldl 的具体实现。它会使用。确实对于 f ~ Maybe实现可以不同于 f ~ [] ,因此取决于 f 的类型,不同的foldl用来。
如果我们指定类型,例如使用 [Int] , 或 Maybe Char ,这有效(它会引发错误,但这是因为 undefined 当然不会正确评估):

Prelude> foldl undefined undefined (undefined :: Maybe Char)
*** Exception: Prelude.undefined
CallStack (from HasCallStack):
  error, called at libraries/base/GHC/Err.hs:78:14 in base:GHC.Err
  undefined, called at <interactive>:1:6 in interactive:Ghci1
Prelude> foldl undefined undefined (undefined :: [Int])
*** Exception: Prelude.undefined
CallStack (from HasCallStack):
  error, called at libraries/base/GHC/Err.hs:78:14 in base:GHC.Err
  undefined, called at <interactive>:2:6 in interactive:Ghci1
对于某些类型类,如 Num ,有type defaulting [Wkang's Haskell; blog] .这使用:
default Num Integer
default Real Integer
default Enum Integer
default Integral Integer
default Fractional Double
default RealFrac Double
default Floating Double
default RealFloat Double

关于haskell - 为什么我不能在任何地方都使用 undefined ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66892098/

相关文章:

haskell - Foldr 和 Foldl Haskell 解释

haskell - 如何使用异常处理在 Haskell 中编写 "retryForever"函数?

haskell - 在 Windows 上安装 Haskell cairo

functional-programming - 如何将函数应用于变体?

.net - clojure 与 C# 语言

haskell - 无法证明 Haskell 中显式类型绑定(bind)错误中的约束

haskell - 是否可以在 Haskell 中使用 if 函数使用模式匹配?

ios - 为什么在我添加自动布局约束时我的 textview 不显示?

mysql - 通过匹配字段的子集来防止重复条目

ios - 如何在其他 View 生成之前完成一个 View 约束