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을 나타냅니다.)
감사합니다,하지만 난 당신이 위에서 언급 한 코드를 찾을 수 없습니다 문서. 페이지 번호가 무엇인지 말할 수 있습니까? (내가 지적한 pdf 문서의 eval1 코드는 다음과 같이 4 페이지에 있습니다.'eval1 env (Var n) = Map.lookup n env' – Sibi
약 2/3의 코드를 인용 한 코드를 봅니다. 4 페이지를 참조하십시오. 새로운 사본이 필요합니까? 각주는 2012 년에 문서가 업데이트되었음을 나타냅니다. –
아, 죄송합니다. 문서 사본을 가지고 있습니다. – Sibi