小编the*_*pie的帖子

Haskell代码散落着TVar操作和函数带来许多争论:代码味道?

我正在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表达式和函数.以下是我的问题:这是代码味道吗?我错过了一些可以使我的代码更优雅的抽象吗?有没有更理想的方法来构建我的数据/代码?

谢谢!

haskell stm tvar

14
推荐指数
2
解决办法
614
查看次数

如果由于多方式使HLint忽略解析错误?

我正在使用MultiWayIf语言扩展.虽然我喜欢HLint(我使用的是版本v1.8.61),但遗憾的是HLint似乎并不知道这个扩展,并且它将多路ifs报告为解析错误: Warning: Parse error: |

HLint手册(http://community.haskell.org/~ndm/darcs/hlint/hlint.htm)描述了如何使用编译指示来指出要忽略的建议; 但是,由于解析错误,这似乎不适用于警告.

有没有办法告诉HLint忽略解析错误警告?谢谢!

haskell hlint

8
推荐指数
1
解决办法
421
查看次数

Haskell:我应该使用Data.Text.Lazy.Builder来构造我的Text值吗?

我正在开发一个大型应用程序,可以动态构建大量Data.Text值.我一直在Text使用(<>)和构建我的所有值Data.Text.concat.

我最近才知道这种Builder类型的存在.该起点哈斯克尔书中有这样一段话吧:

每次连接两个元素时,都Text必须创建一个新值,这会带来一些开销来分配内存,复制数据,以及跟踪值并在不再需要时释放它... textbytestring包提供Builder可用于有效生成大文本值的数据类型.[第240页]

但是,这本书没有说明"大文本值"的确切含义.

所以,我想知道我是否应该重构我的代码来使用Builder.也许你可以帮我做出决定.具体来说,我有这些问题:

1)是否有任何关于何时应该选择Builder连接的指南或"最佳实践" ?或者,我怎么知道一个给定的Text值足够"大",值得使用Builder

2)使用Builder"没脑子",或者在进行大规模重构之前是否值得进行一些分析以确认其好处?

谢谢!

text haskell

5
推荐指数
1
解决办法
492
查看次数

为什么使用 Haskeline 的 outputStrLn 与传统的 putStrLn 相比?

我的问题:使用 HaskelineoutputStrLn相比有什么优势吗?putStrLn

背景:

我最近将 Haskeline 引入到我的终端应用程序中,以便利用getInputLine函数的行编辑 UI。(这需要对我的 monad 变压器堆栈进行一些重大更改。)

从那以后我注意到 Haskeline 附带了outputStroutputStrLn输出函数。现在我已经不厌其烦地采用了该库,我想知道我是否也应该更喜欢这些输出函数而不是标准putStrputStrLn. 考虑到相关函数返回的不同单子,这将需要更多重构。

terminal haskell haskeline

5
推荐指数
0
解决办法
234
查看次数

标签 统计

haskell ×4

haskeline ×1

hlint ×1

stm ×1

terminal ×1

text ×1

tvar ×1