我写了一个函数f
,我在 a 中使用它foldM
:
foldM (f xs) [] ids
...
f xs acc id = case lookup id xs of
Just x -> return $ acc ++ [(id, x)]
Nothing -> throwError $ TypeError "Cannot project nonexisting field"
我为它写的类型签名是:
[(String, Value)] -> [(String, Value)] -> String -> EvalMonad [(String, Value)]
然后我决定删除类型签名,因为函数本身就足够简单且具有描述性。当我使用 hdevtools 获取推断类型时,我得到了
[(t, t)] -> [(t, t)] -> t -> m [(t, t)]
这是什么?我猜 t 与通常的a
或b
您通常看到的不同。元组的第一个和第二个元素不是同一类型(不,SValue 不是 String 的类型同义词),而此签名暗示了该约束。另外,为什么 monad m 没有类约束?我在这里没有使用整个 EvalMonad 堆栈,但m
至少应该是MonadError
.