我正在閱讀通過Monad Transformer文件。 我都碰到過這樣的代碼示例:單變壓器文件:eval1不typecheck
import qualified Data.Map as Map
import Control.Monad.Identity
type Eval1 a = Identity a
runEval1 :: Eval1 a -> a
runEval1 ev = runIdentity ev
type Name = String
data Exp = Lit Integer
| Var Name
| Plus Exp Exp
| Abs Name Exp
| App Exp Exp
deriving (Show)
data Value = IntVal Integer
| FunVal Env Name Exp
type Env = Map.Map Name Value
他們寫的是評價功能:
eval0 :: Env -> Exp -> Value
eval0 env (Var i) = fromJust $ Map.lookup i env
並與一元式的另一種評價函數:
eval1 :: Env -> Exp -> Eval1 Value
eval1 env (Var n) = Map.lookup n env
(I」 m只是顯示eval1
功能的一部分,我有問題)
eval0
功能typechecks但eval1
不typecheck。那麼這個文檔中的錯誤還是我錯過了什麼?
此外,他們去解釋這樣的約eval1
:
瓦爾情況下不需要fromJust調用了:原因是簡單地調用 是 Map.lookup被定義爲任何單子內工作monad的失敗函數 - 這很適合我們的monadic公式 這裏。 (該也許單子的失敗函數返回Nothing,而 的身份單子的失敗函數拋出一個異常,這 會導致不同的錯誤信息。)
但被Map.lookup
定義的任何單子的工作? (它的類型簽名表明它retuns一個Maybe
值。)
謝謝,但我無法找到你在上面提到的代碼文件。你能告訴它是什麼頁碼嗎? (在我指出的pdf文檔中,eval1的代碼在第4頁中是這樣的:'eval1 env(Var n) = Map.lookup n env' – Sibi
我看到我引用的關於2/3碼的代碼第4頁。您是否需要獲取新副本或其他內容?腳註建議2012年文檔已更新。 –
對不起,我收到了該文檔的舊副本。 – Sibi