我应该如何组织状态monad中的普通和"状态"版本的函数?

Car*_*ate 2 haskell

我决定尝试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个不同版本的任何操作?

Tik*_*vis 9

就个人而言,我自己也没有单独的州版本功能.而是使用该modify功能:

do let o = player
   modify (setPlayer o)
   something else
Run Code Online (Sandbox Code Playgroud)

从某种意义上说,您正在寻找的命名约定与使用相同,modify除了折叠到每个函数的名称中.当我发现自己命名函数的这个样子,我通常试图找到某种方式来组织他们语言,而不是使用自己的名字.有时,像这里一样,现有的功能就是你所需要的; 其他时候,它涉及创建自己的功能以实现相同的目的或将事物提取到模块中.

核心思想是,最好使用一流的语言结构来验证代码中的模式,而不是间接地将它们编码到名称中.(当然,如果这最终真的很尴尬,你不应该这样做,但这里很好.)