В Haskell вы не можете изменять данные на месте, когда-либо, с помощью любого механизма. Вообще. 1
Способ обновления состояния моделируется в Haskell путем создания нового значения, которое идентично старому значению, за исключением «обновленного» бита.
Например, то, что вы пытаетесь сделать, будет выражаться так:
func :: Car -> CarState -> CarState
func (ChangeColor c) cs = cs { color = c }
1 Ну, хорошо, технически вы можете иногда, но это работает только для данных, которые были заранее организованы, чтобы быть изменяемыми, и это обычно довольно громоздко. Не обычный способ написания программ.