在 Maybe 中使用 isNothing 函数时出现 Haskell 错误

Khu*_*har 1 haskell functional-programming

我试图在 Haskell 的代码中使用 isNothing,但它给了我错误

\n
<interactive>:97:23: error:\n\xe2\x80\xa2 Variable not in scope: isNothing :: Maybe t -> Bool\n\xe2\x80\xa2 Perhaps you meant data constructor \xe2\x80\x98Nothing\xe2\x80\x99 (imported from Prelude)\n
Run Code Online (Sandbox Code Playgroud)\n

我的代码行如下 -

\n
 maybeMap f value = if isNothing (value) then value else Just (f (check value))\n
Run Code Online (Sandbox Code Playgroud)\n

isNothing value如果我替换为,则效果很好value == Nothing,所以我很困惑为什么前一个不起作用。

\n

Ben*_*Ben 5

首先,错误消息中的关键词是:

Variable not in scope: isNothing
Run Code Online (Sandbox Code Playgroud)

这意味着编译器不知道任何名为isNothing.

这立即告诉您,您使用的代码isNothing 并不重要。这不是类型的问题,也不是与您尝试调用的实际函数有关的问题isNothing,并且您无法更改代码isNothing以使其正常工作。

Variable not in scope几乎总是意味着以下三件事之一:

  1. 您尚未导入您要使用的名称
  2. 您不小心拼错了您要使用的名称
  3. 您打算用该名称定义某些内容,但尚未这样做

更改任何与您的使用相关的代码都isNothing不会改变这三个问题中的任何一个,无论它是什么。即使查看该代码也不会告诉您任何相关信息;只需仔细查看错误消息中名称的拼写,以确认您没有输入错误,如果没有,您就知道需要到其他地方查找。

在这种情况下,它是#1。Haskell 中有很多有用的函数,Prelude它们会自动为您导入,因此您可能习惯于只使用函数而不导入它们,但“正常”情况是要使用任何已定义的内容,您必须导入它。isNothing不在 中Prelude,因此这意味着要使用它,您必须找出它所在的模块并添加导入声明以使其可用。(如果该模块位于尚未安装的软件包中,您还必须获取该软件包;我不会在这里解决这个问题)

isNothing来自Data.Maybe模块(在base包中,它总是作为安装 GHC 的一部分安装,所以不用担心)。所以你需要使用:

import Data.Maybe
Run Code Online (Sandbox Code Playgroud)

如果您正在处理文件,则需要将其添加到文件顶部(就在模块头之后,但在您自己定义任何名称之前;所有导入都必须位于您自己的任何代码之前)。如果您使用解释器,则只需输入导入作为命令即可。

这会将定义的所有名称纳入Data.Maybe范围。如果您想要更多控制,可以显式仅导入部分名称,如下所示:

import Data.Maybe ( isNothing, isJust, listToMaybe )
Run Code Online (Sandbox Code Playgroud)