1

我试图理解为什么在这个简单的代码purescript中无法正确推断参数的类型:map

maybeInc :: String -> StateT (Maybe Int) Identity Unit
maybeInc "a" = modify $ map (1 +)
maybeInc _ = return unit

这是我的错误信息:

  找不到类型类实例

    Control.Monad.State.Class.MonadState (_0 Int)
                                         (StateT(也许是 Int)身份)

  实例头包含未知类型变量。考虑添加类型注释。

但是,如果我手动指定类型,它会起作用:

maybeInc "a" = modify $ \(m :: Maybe Int) -> map (1 +) m

为什么它不想自动推断这种类型,即使它已经在函数签名中提供?

4

1 回答 1

2

当前的编译器无法对函数依赖进行建模,Haskell 和mtl库中使用函数依赖来捕获MonadState.

这意味着编译器无法确定两种状态类型必须相同(也就是说,如果我们找到MonadStatefor的实例StateT (Maybe Int) Identity,则状态类型被强制为Maybe Int)。

目前,一种解决方案是添加类型注释:

maybeInc :: String -> StateT (Maybe Int) Identity Unit
maybeInc "a" = modify modifier
  where
    modifier :: Maybe Int -> Maybe Int
    modifier = map (1 +)
maybeInc _ = return unit
于 2016-03-13T20:17:34.857 回答