首页 > 解决方案 > 为什么我不能在任何地方都使用 undefined ?

问题描述

我想我总是可以把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临时占位符?

标签: haskellfunctional-programmingconstraintstypechecking

解决方案


解释器不知道要使用什么类型ffoldl :: Foldable f => (a -> b -> a) -> a -> f b -> a因此出现错误。这很重要,因为这里确切地决定了它将使用f什么实现。foldl实际上,对于 af ~ Maybe的实现可能与对于 a 不同f ~ [],因此根据 for 的类型f,使用不同foldl的。

如果我们指定类型,例如使用[Int], or 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,有类型默认[Wkang's Haskell; 博客] . 这使用:

default Num Integer
default Real Integer
default Enum Integer
default Integral Integer
default Fractional Double
default RealFrac Double
default Floating Double
default RealFloat Double

推荐阅读