haskell - 为什么我不能在任何地方都使用 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
临时占位符?
解决方案
解释器不知道要使用什么类型f
,foldl :: 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
推荐阅读
- mysql - 如何在 SQL Server 中使用计数来查找百分比
- dart - Flutter:带有选项的键盘编号未在 Android 设备上显示,仅在模拟器上显示。
- python - 拟合下的神经网络 - 乳腺癌数据集
- javascript - 为反比例编写Javascript
- python - 如何计算大数组中字符串的某些元素?
- google-cloud-functions - 尝试通过媒体响应履行来播放播客剧集的 MP3 时收到错误消息
- python - Python / Django:从 cookie 中获取 var
- javascript - 使用带有 Javascript 的 JSON 数据在 HTML 中创建可点击列表
- c - 没有 if 的队列入队函数
- python - 在 python 中使用正则表达式仅匹配未引用的单词