Haskell 为什么GHC抱怨类型错误?

Haskell 为什么GHC抱怨类型错误?,haskell,types,compiler-errors,brainfuck,Haskell,Types,Compiler Errors,Brainfuck,这个小函数检查(有限)Brainfuck字符串的有效性。它检查[和]是否平衡。代码非常简单,并且编写为尾部递归: -- checks Brainfuck for validity. validateBrainfuck :: Monad m => String -> m String validateBrainfuck s = maybe (return s) (fail . fromJust) (validate s 0) where validate :: String -&g

这个小函数检查(有限)Brainfuck字符串的有效性。它检查
[
]
是否平衡。代码非常简单,并且编写为尾部递归:

-- checks Brainfuck for validity.
validateBrainfuck :: Monad m => String -> m String
validateBrainfuck s = maybe (return s) (fail . fromJust) (validate s 0) where
  validate :: String -> Int -> Maybe String -- Here inversed: String means error
  validate (']':_ ) 0 = Just "Too many closing brackets"
  validate (']':xs) c = validate xs (pred c)
  validate ('[':xs) c = validate xs (succ c)
  validate ( x :xs) c = validate xs       c
  validate []       0 = Nothing
  validate []       _ = Just "Too many opening brackets"
现在,GHC抱怨打字问题:

Brainfuck.hs:62:58:
    Couldn't match expected type `Maybe String'
           against inferred type `[Char]'
      Expected type: Maybe (Maybe String)
      Inferred type: Maybe String
    In the third argument of `maybe', namely `(validate s 0)'
    In the expression:
        maybe (return s) (fail . fromJust) (validate s 0)

也许我太傻了,不知道出了什么问题,但这对我来说很奇怪。

看看
的类型,也许
,想想它应该做什么:

maybe :: b -> (a -> b) -> Maybe a -> b
如果maybe值不包含任何结果(即
Nothing
),则
maybe
返回
b
参数

否则-当只给出一个时-它将给定函数应用于有效结果。我们不需要从这里提取任何

你的代码就变成了

maybe (return s) fail (validate s 0)

查看
的类型,可能
并思考它应该做什么:

maybe :: b -> (a -> b) -> Maybe a -> b
如果maybe值不包含任何结果(即
Nothing
),则
maybe
返回
b
参数

否则-当只给出一个
时-它将给定函数应用于有效结果。我们不需要从这里提取任何

你的代码就变成了

maybe (return s) fail (validate s 0)

另外,作为类型签名的
字符串()
怎么样?那么,您就不能逆转定义良好的语义。另外,两者都是Monad(嗯,有点……请参见
Control.Monad.Error
),因此您甚至不必
失败
。我希望类型签名尽可能通用。所以我这样做了。另外,作为类型签名的
字符串()
怎么样?那么,您就不能逆转定义良好的语义。另外,两者都是Monad(嗯,有点……请参见
Control.Monad.Error
),因此您甚至不必
失败
。我希望类型签名尽可能通用。所以我做了这个。