Бесконечные типы Haskell и моя функция FSM

Я только что наткнулся на «бесконечный тип» в Haskell, когда пытался написать конечный автомат. Я думал, что следующее было очень интуитивно понятно:

fsm []     _     acc = Right acc
fsm (x:xs) state acc =
    case state acc x of
        Left err     -> Left err
        Right (s, a) -> fsm xs s a

Я даю функции состояния текущее состояние (аккумулятор) и новое событие, а функция состояния создает следующую функцию состояния вместе с новым аккумулятором. Я повторяю, пока у меня не кончатся события.

Компилятор сообщает мне:

Occurs check: cannot construct the infinite type:
  t1 = b0 -> t0 -> Either a0 (t1, b0)
In the second argument of `fsm', namely `s'

Потому что состояние теперь имеет бесконечный тип. Как мне изменить это, чтобы заставить его работать?

5
задан Ana 26 December 2011 в 21:51
поделиться