我正在尝试在 PureScript 中编写类似 Redux 的存储。
我为每个动作定义Action
了类型类和代数数据类型,以划分为更小的模块。
class Action a
data FooAction
= UpdateFoo String
| ResetFoo
data BarAction
= UpdateBar Int
| ResetBar
data ResetAll = ResetAll
instance fooAction :: Action FooAction
instance barAction :: Action BarAction
并定义了一些状态类型和更新函数。更新函数可以接收所有类型的动作。
newtype Foo = Foo String
newtype Bar = Bar Int
updateFoo :: forall a. (Action a) => a -> Foo -> Foo
updateFoo a foo =
case a of
UpdateFoo str -> Foo str
ResetFoo -> Foo ""
ResetAll -> Foo ""
_ -> foo
updateBar :: forall a. (Action a) => a -> Bar -> Bar
updateBar a bar =
case a of
UpdateBar num -> Bar num
ResetBar -> Bar 0
ResetAll -> Bar 0
_ -> bar
但是此代码会产生 TypesDoNotUnify 错误。
Could not match type
FooAction
with type
a0
while checking that expression case a of
(UpdateFoo str) -> Foo str
ResetFoo -> Foo ""
ResetAll -> Foo ""
_ -> foo
has type Foo
in value declaration updateFoo
where a0 is a rigid type variable
为什么会出现这个错误?我应该如何实现这样的更新功能?