Haskell 在 Maybe 中使用 isNothing 函数时出错
Haskell error when using the isNothing function in Maybe
我正在尝试在 Haskell 的代码中使用 isNothing,但出现错误
<interactive>:97:23: error:
• Variable not in scope: isNothing :: Maybe t -> Bool
• Perhaps you meant data constructor ‘Nothing’ (imported from Prelude)
我的代码行如下-
maybeMap f value = if isNothing (value) then value else Just (f (check value))
如果我将 isNothing value
替换为 value == Nothing
,则效果很好,所以我很困惑为什么以前的不起作用。
函数 isNothing
不是 standard prelude. Rather, it's distributed as part of the Data.Maybe
模块的一部分。要使用 isNothing
,您需要显式导入该模块:
import Data.Maybe
首先,错误消息中的关键短语是:
Variable not in scope: isNothing
这意味着编译器不知道任何名为 isNothing
.
的东西
这立即告诉您,围绕您使用 isNothing
的代码无关紧要。这不是类型的问题,也不是与您尝试调用的实际 isNothing
函数有关的任何问题,并且您无法更改 isNothing
周围的代码以使其正常工作。
Variable not in scope
几乎总是意味着以下三种情况之一:
- 您尚未导入您尝试使用的名称
- 您不小心拼错了要使用的名称
- 您打算用该名称定义一些东西,但还没有这样做
更改任何围绕您使用 isNothing
的代码都不会改变这 3 个问题中的任何一个,无论它是哪个。即使查看该代码也不会告诉您任何相关信息;只需仔细查看错误消息中名称的拼写,确认您没有打错字,如果没有,您知道您需要查看其他地方。
在这种情况下它是#1。 Haskell Prelude
中有一堆有用的函数,它们会自动为您导入,因此您可能习惯于只使用函数而不导入它们,但“正常”情况是要使用任何已经定义的东西,你必须导入它。 isNothing
不在 Prelude
中,因此这意味着要使用它,您必须找出它在哪个模块中并添加导入声明以使其可用。 (如果该模块位于尚未安装的包中,您还必须获取该包;这是一个我不打算在这里解决的问题)
isNothing
来自 Data.Maybe
模块(在 base
包中,它总是作为安装 GHC 的一部分安装,所以不用担心)。所以你需要使用:
import Data.Maybe
如果你在一个文件中工作,你需要将它添加到文件的顶部(就在模块头之后,但在你自己定义任何名称之前;所有导入必须在你自己的代码之前) .如果您使用的是解释器,则只需将导入作为命令输入即可。
这会将 Data.Maybe
中定义的 所有 名称纳入范围。如果你想要更多的控制,你可以显式地只导入一些名字,像这样:
import Data.Maybe ( isNothing, isJust, listToMaybe )
我正在尝试在 Haskell 的代码中使用 isNothing,但出现错误
<interactive>:97:23: error:
• Variable not in scope: isNothing :: Maybe t -> Bool
• Perhaps you meant data constructor ‘Nothing’ (imported from Prelude)
我的代码行如下-
maybeMap f value = if isNothing (value) then value else Just (f (check value))
如果我将 isNothing value
替换为 value == Nothing
,则效果很好,所以我很困惑为什么以前的不起作用。
函数 isNothing
不是 standard prelude. Rather, it's distributed as part of the Data.Maybe
模块的一部分。要使用 isNothing
,您需要显式导入该模块:
import Data.Maybe
首先,错误消息中的关键短语是:
Variable not in scope: isNothing
这意味着编译器不知道任何名为 isNothing
.
这立即告诉您,围绕您使用 isNothing
的代码无关紧要。这不是类型的问题,也不是与您尝试调用的实际 isNothing
函数有关的任何问题,并且您无法更改 isNothing
周围的代码以使其正常工作。
Variable not in scope
几乎总是意味着以下三种情况之一:
- 您尚未导入您尝试使用的名称
- 您不小心拼错了要使用的名称
- 您打算用该名称定义一些东西,但还没有这样做
更改任何围绕您使用 isNothing
的代码都不会改变这 3 个问题中的任何一个,无论它是哪个。即使查看该代码也不会告诉您任何相关信息;只需仔细查看错误消息中名称的拼写,确认您没有打错字,如果没有,您知道您需要查看其他地方。
在这种情况下它是#1。 Haskell Prelude
中有一堆有用的函数,它们会自动为您导入,因此您可能习惯于只使用函数而不导入它们,但“正常”情况是要使用任何已经定义的东西,你必须导入它。 isNothing
不在 Prelude
中,因此这意味着要使用它,您必须找出它在哪个模块中并添加导入声明以使其可用。 (如果该模块位于尚未安装的包中,您还必须获取该包;这是一个我不打算在这里解决的问题)
isNothing
来自 Data.Maybe
模块(在 base
包中,它总是作为安装 GHC 的一部分安装,所以不用担心)。所以你需要使用:
import Data.Maybe
如果你在一个文件中工作,你需要将它添加到文件的顶部(就在模块头之后,但在你自己定义任何名称之前;所有导入必须在你自己的代码之前) .如果您使用的是解释器,则只需将导入作为命令输入即可。
这会将 Data.Maybe
中定义的 所有 名称纳入范围。如果你想要更多的控制,你可以显式地只导入一些名字,像这样:
import Data.Maybe ( isNothing, isJust, listToMaybe )