Map.lookup的Maybe结果不是我的Monad Transformer堆栈的类型检查

Van*_*uel 10 monads dictionary haskell monad-transformers maybe

我将通过以下论文:Monad Transformers Step by Step.在第2.1节"转换为一元样式",一个函数转换为返回ValueEval1单子.这部分功能对我来说没有意义:

eval1 env (Var n) = Map.lookup n env
Run Code Online (Sandbox Code Playgroud)

然而,结果将是Maybe Value函数的类型签名是:

eval1 :: Env ? Exp ? Eval1 Value
Run Code Online (Sandbox Code Playgroud)

该函数无法键入检查,错误对我来说似乎很明显.然而,作者明确指出这将有效:

... Var的情况不再需要一个fromJust调用了:原因是Map.lookup被定义为只需调用monad的失败函数就可以在任何monad中工作 - 这非常适合我们的monadic公式.

Map.lookup的签名看起来不像是用于任何monad:

lookup :: Ord k => k -> Map k a -> Maybe a
Run Code Online (Sandbox Code Playgroud)

这篇论文是否已过时或者我遗失了什么?如果论文实际上已经过时,为什么lookup改为只能使用Maybe.

谢谢!

dup*_*ode 14

你的教程是从2006年开始的.它使用了一个很老的版本,Data.Map其中lookup的类型确实是:

lookup :: (Monad m, Ord k) => k -> Map k a -> m a
Run Code Online (Sandbox Code Playgroud)

我认为发生了这种变化,因为fail人们普遍认为这是一种疣Monad.返回a Maybe a使查找失败明确且易于管理.通过隐藏它fail只是为了让一个稍微更方便的类型隐藏它是非常脏的IMO.(另见与Ørjan有关的问题.)