2013-12-22 47 views
3

我正在閱讀通過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值。)

回答

4

其實我看到這個代碼的文檔中eval1,應進行類型檢查罰款(我重新縮進吧):

eval1 env (Var n) = 
    maybe (fail ("undefined variable: " ++ n)) return $ 
     Map.lookup n env 

看來, Map.lookup並較早具有更普遍的簽名:http://hackage.haskell.org/package/containers-0.1.0.0/docs/Data-Map.html

由於從2006年的文件日期,仍然有開頭說:「移植你引用上面指出Map.lookup具有更普遍的簽名文本,而是一個註腳新GHC在201 2「,我認爲代碼已經更新,但文本沒有更新。

編輯:

我找到了在Map.lookup變化的歷史,從2008年約會:Code changeTrac ticketLibraries list discussion

+0

謝謝,但我無法找到你在上面提到的代碼文件。你能告訴它是什麼頁碼嗎? (在我指出的pdf文檔中,eval1的代碼在第4頁中是這樣的:'eval1 env(Var n) = Map.lookup n env' – Sibi

+0

我看到我引用的關於2/3碼的代碼第4頁。您是否需要獲取新副本或其他內容?腳註建議2012年文檔已更新。 –

+0

對不起,我收到了該文檔的舊副本。 – Sibi