我試圖在 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,這可以正常作業,所以我很困惑為什么以前的不起作用。
uj5u.com熱心網友回復:
首先,錯誤訊息中的關鍵短語是:
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 )
uj5u.com熱心網友回復:
該功能isNothing不是標準前奏的一部分。相反,它作為Data.Maybe模塊的一部分進行分發。要使用isNothing,您需要顯式匯入該模塊:
import Data.Maybe
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/316864.html
