我决定尝试State Monad尝试清理我已经开始的一些项目.我遇到了命名/分区问题.
如果我有以下对象:
data Obj = Player { oPos :: Point }
data World = World { wKeys :: [Key], wPlayer :: Obj }
Run Code Online (Sandbox Code Playgroud)
我可能有一个方便的功能,如:
setPlayer :: Obj -> World -> World
setPlayer o w = w{wPlayer = o}
Run Code Online (Sandbox Code Playgroud)
和匹配的状态操作,如:
setPlayerW :: Obj -> WorldState ()
setPlayerW o = get >>= put . setPlayer o
Run Code Online (Sandbox Code Playgroud)
它使用其他便利功能; 为了方便.
对于这样的事情,典型的命名约定是什么?我用W贴了国家版,但这有点难看.
并且"状态版本"是否典型地与单独文件中的"对象版本"隔离?
我完全错了吗?有没有更好的设置,然后我可能需要2个不同版本的任何操作?
就个人而言,我自己也没有单独的州版本功能.而是使用该modify功能:
do let o = player
modify (setPlayer o)
something else
Run Code Online (Sandbox Code Playgroud)
从某种意义上说,您正在寻找的命名约定与使用相同,modify除了折叠到每个函数的名称中.当我发现自己命名函数的这个样子,我通常试图找到某种方式来组织他们的语言,而不是使用自己的名字.有时,像这里一样,现有的功能就是你所需要的; 其他时候,它涉及创建自己的功能以实现相同的目的或将事物提取到模块中.
核心思想是,最好使用一流的语言结构来验证代码中的模式,而不是间接地将它们编码到名称中.(当然,如果这最终真的很尴尬,你不应该这样做,但这里很好.)