我正在Haskell中编写MUD服务器(MUD =多用户地牢:基本上是一个多用户文本冒险/角色扮演游戏).游戏世界数据/状态以大约15种不同的IntMaps表示.我的monad变换器堆栈看起来像这样:ReaderT MudData IO,其中MudData类型是包含IntMaps 的记录类型,每个都在自己的TVar(我使用STM进行并发):
data MudData = MudData { _armorTblTVar :: TVar (IntMap Armor)
, _clothingTblTVar :: TVar (IntMap Clothing)
, _coinsTblTVar :: TVar (IntMap Coins)
Run Code Online (Sandbox Code Playgroud)
...等等.(我正在使用镜头,因此是下划线.)
有些功能需要某些功能IntMap,而其他功能需要其他功能.因此,每个IntMap都有自己的TVar粒度.
但是,我的代码中出现了一种模式.在处理播放器命令的函数中,我需要TVar在STM monad中读取(有时稍后写入)我的s.因此,这些函数最终在其where块中定义了STM帮助器.这些STM助手通常readTVar在其中有相当多的操作,因为大多数命令需要访问少数几个IntMaps.此外,给定命令的函数可以调用许多纯辅助函数,这些函数也需要一些或全部IntMaps.因此,这些纯辅助函数有时会占用大量参数(有时超过10).
所以,我的代码变得"乱七八糟",有很多带有大量参数的readTVar表达式和函数.以下是我的问题:这是代码味道吗?我错过了一些可以使我的代码更优雅的抽象吗?有没有更理想的方法来构建我的数据/代码?
谢谢!
我正在使用MultiWayIf语言扩展.虽然我喜欢HLint(我使用的是版本v1.8.61),但遗憾的是HLint似乎并不知道这个扩展,并且它将多路ifs报告为解析错误:
Warning: Parse error: |
HLint手册(http://community.haskell.org/~ndm/darcs/hlint/hlint.htm)描述了如何使用编译指示来指出要忽略的建议; 但是,由于解析错误,这似乎不适用于警告.
有没有办法告诉HLint忽略解析错误警告?谢谢!
我正在开发一个大型应用程序,可以动态构建大量Data.Text值.我一直在Text使用(<>)和构建我的所有值Data.Text.concat.
我最近才知道这种Builder类型的存在.该起点哈斯克尔书中有这样一段话吧:
每次连接两个元素时,都
Text必须创建一个新值,这会带来一些开销来分配内存,复制数据,以及跟踪值并在不再需要时释放它...text和bytestring包提供Builder可用于有效生成大文本值的数据类型.[第240页]
但是,这本书没有说明"大文本值"的确切含义.
所以,我想知道我是否应该重构我的代码来使用Builder.也许你可以帮我做出决定.具体来说,我有这些问题:
1)是否有任何关于何时应该选择Builder连接的指南或"最佳实践" ?或者,我怎么知道一个给定的Text值足够"大",值得使用Builder?
2)使用Builder"没脑子",或者在进行大规模重构之前是否值得进行一些分析以确认其好处?
谢谢!
我的问题:使用 HaskelineoutputStrLn相比有什么优势吗?putStrLn?
背景:
我最近将 Haskeline 引入到我的终端应用程序中,以便利用getInputLine函数的行编辑 UI。(这需要对我的 monad 变压器堆栈进行一些重大更改。)
从那以后我注意到 Haskeline 附带了outputStr和outputStrLn输出函数。现在我已经不厌其烦地采用了该库,我想知道我是否也应该更喜欢这些输出函数而不是标准putStr和putStrLn. 考虑到相关函数返回的不同单子,这将需要更多重构。