为什么我不能到处使用 undefined ?
Why can't I use undefined just everywhere?
我想我总是可以把 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
作为临时占位符的地方是什么?
解释器不知道 foldl :: Foldable f => (a -> b -> a) -> a -> f b -> a
中的 f
使用什么类型,因此出现错误。这一点很重要,因为这里的 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
我想我总是可以把 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
作为临时占位符的地方是什么?
解释器不知道 foldl :: Foldable f => (a -> b -> a) -> a -> f b -> a
中的 f
使用什么类型,因此出现错误。这一点很重要,因为这里的 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