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)\nisNothing value
如果我替换为,则效果很好value == Nothing
,所以我很困惑为什么前一个不起作用。
首先,错误消息中的关键词是:
Variable not in scope: isNothing
Run Code Online (Sandbox Code Playgroud)
这意味着编译器不知道任何名为isNothing
.
这立即告诉您,您使用的代码isNothing
并不重要。这不是类型的问题,也不是与您尝试调用的实际函数有关的问题isNothing
,并且您无法更改代码isNothing
以使其正常工作。
Variable not in scope
几乎总是意味着以下三件事之一:
更改任何与您的使用相关的代码都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)