Эта небольшая функция проверяет (конечную) строку Brainfuck на достоверность. Он проверяет, сбалансированы ли [
и ]
. Код очень прост и написан, чтобы быть хвостовой рекурсией:Почему GHC жалуется на неправильный тип?
-- 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)
Может быть, я просто слишком глуп, чтобы понять, что пошло не так, но это выглядит очень странно для меня.
Кроме того, как о 'Либо String()' в качестве типа подписи? Затем вы не изменяете четко определенную семантику. Кроме того, это Monad (ну, вроде ... см. 'Control.Monad.Error'), поэтому вам даже не нужно« терпеть неудачу ». – jrockway
Я хочу, чтобы подпись типа была как можно более универсальной. Поэтому я сделал это. – fuz