2010-08-22 2 views
0

Эта небольшая функция проверяет (конечную) строку 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) 

Может быть, я просто слишком глуп, чтобы понять, что пошло не так, но это выглядит очень странно для меня.

+0

Кроме того, как о 'Либо String()' в качестве типа подписи? Затем вы не изменяете четко определенную семантику. Кроме того, это Monad (ну, вроде ... см. 'Control.Monad.Error'), поэтому вам даже не нужно« терпеть неудачу ». – jrockway

+0

Я хочу, чтобы подпись типа была как можно более универсальной. Поэтому я сделал это. – fuz

ответ

5

Посмотрите на тип maybe и думать, что он должен делать:

maybe :: b -> (a -> b) -> Maybe a -> b 

Если возможно, значение не содержит никакого результата (т.е. Nothing), maybe возвращает b аргумент.

Иначе - когда Just a дается - она ​​применяет данную функцию к действительного результата. Мы не нуждаемся в добыче fromJust здесь.

Ваш код только становится

maybe (return s) fail (validate s 0) 
+0

ВЫ прав. (Какой вопрос-вопрос) ... стыдно за меня. – fuz

Смежные вопросы