我写了一个函数f
,我在一个foldM
使用:推断的Haskell类型签名中的类型“t”是什么?
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不是字符串类型的同义词),而此签名意味着该约束。另外,monad m为什么没有类限制?我在这里没有使用整个EvalMonad堆栈,但m
至少应该是MonadError
的一个实例。
我想你在复制/粘贴该类型时放弃了一个约束。你应该得到'Monad m => [(t,t)] - > [(t,t)] - > t - > m [(t,t)]'的类型。差异是相当重要的。 –
nope,这是hdevtools打印的。我认为,最终ghci必须把事情做好,否则我会得到段错误或类似的错误,但我想知道为什么错误。 AFAIK,hdevtools和ghc-mod是人们用于类型推断的。这是非常有用的,但当我分析一个不平凡的表达时,我不能让它脱落...... – BruceBerry
看起来像这是[this ghc-mod bug](https://github.com/kazu-yamamoto/ghc -mod /问题/ 69)。 –