我最近开始了一个小爱好项目,在那里我尝试实施技巧卡片游戏Skat(3名玩家).为了能够让不同类型的玩家(如AI,网络和本地)一起玩,我使用类型类设计了一个界面Player:
class Monad m => Player p m | p -> m where
playerMessage :: Message answer -> p -> m (Either Error answer,p)
Run Code Online (Sandbox Code Playgroud)
我用a StateT来结束这三个玩家:
type PST a b c m x = StateT (Players a b c) m x
Run Code Online (Sandbox Code Playgroud)
但是现在,我必须在每个类型签名中写一大堆上下文:
dealCards :: (Player a m, Player b m, Player c m, RandomGen g)
=> g -> PST a b c m (SomeOtherState,g)
Run Code Online (Sandbox Code Playgroud)
我怎样才能避免一次又一次地写这个大背景?
haskell ×1