2013-12-22 3 views
3

Monad Transformer 문서를 읽고 있습니다. 그리고이 코드 샘플을 가로 질러 온 :모나드 트랜스포머 문서 : eval1은 형식 검사를하지 않습니다.

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 

(나 '를 단지 내가 문제가있는 eval1 기능의 일부를 보여주는 것)

eval0 기능 형식 검사가 있지만 eval1 형식 검사를 수행하지 않습니다. 그 문서에이 오류가 있습니까? 아니면 뭔가 빠졌습니까?

또한 그들은이 같은 대한 eval1을 설명 갈 : 이유는 단순히 를 호출하여 Map.lookup 어떤 모나드 내에서 작동하도록 정의되어있다 : 더 이상 fromJust 호출을 필요로하지 않는다

바르 케이스 모나드의 실패 함수 - 모나드 공식 과 잘 어울립니다.

합니다 (아마 모나드의 실패 기능은 아무것도. 반면, 어떤 는 다른 오류 메시지에 예외가 이어질 것 던지는 신원 모나드의 기능을 실패, 반환) 그러나 Map.lookup는 모나드와 함께 작동하도록 정의된다? (그것의 유형 서명은 그것이 Maybe 값을 retuns을 나타냅니다.)

답변

4

내가 실제로 (내가 그것을-들여 재) 미세 유형 체킹해야하는, eval1의 문서에이 코드를 참조하십시오

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

이 보인다 Map.lookup 이전보다 일반적인 서명이 있었나요 : 2006에서 문서 날짜 이후 http://hackage.haskell.org/package/containers-0.1.0.0/docs/Data-Map.html

을 여전히에서 새로운 GHC에 "배관 말을 처음에 당신이 Map.lookup이 더 일반적인 서명이 없다는 위에 인용 텍스트,하지만 각주를 가지고 201 2 ", 나는 코드가 업데이트되었지만 텍스트는 그렇지 않다고 생각한다.

편집 : 2008 년 데이트, Map.lookup의 변화의 역사를 추적

: Code change, Trac ticket, Libraries list discussion

+0

감사합니다,하지만 난 당신이 위에서 언급 한 코드를 찾을 수 없습니다 문서. 페이지 번호가 무엇인지 말할 수 있습니까? (내가 지적한 pdf 문서의 eval1 코드는 다음과 같이 4 페이지에 있습니다.'eval1 env (Var n) = Map.lookup n env' – Sibi

+0

약 2/3의 코드를 인용 한 코드를 봅니다. 4 페이지를 참조하십시오. 새로운 사본이 필요합니까? 각주는 2012 년에 문서가 업데이트되었음을 ​​나타냅니다. –

+0

아, 죄송합니다. 문서 사본을 가지고 있습니다. – Sibi