小编Squ*_*mer的帖子

在Haskell中为状态创建只读函数

我经常最终处于使用Statemonad 非常方便的情况,因为有很多相关的函数需要以半命令的方式对同一块数据进行操作.

有些函数需要读取State monad中的数据,但永远不需要更改它.State在这些函数中像往常一样使用monad工作得很好,但我不禁觉得我已经放弃了Haskell的固有安全性并复制了一种语言,任何函数都可以改变任何东西.

有一些类型级的事情,我可以做,以确保这些功能只能读取距离State,并且从来不写呢?

现在的情况:

iWriteData :: Int -> State MyState ()
iWriteData n = do 
    state <- get
    put (doSomething n state)

-- Ideally this type would show that the state can't change.
iReadData :: State MyState Int
iReadData = do 
    state <- get
    return (getPieceOf state)

bigFunction :: State MyState ()
bigFunction = do
    iWriteData 5
    iWriteData 10
    num <- iReadData  -- How do we know that the state …
Run Code Online (Sandbox Code Playgroud)

monads haskell

7
推荐指数
2
解决办法
304
查看次数

管理面向对象游戏中的项目

每隔一段时间我就会想要从我的其他项目中休息一下,尝试将经典冒险基于文本的游戏(在Python中,这次)作为一个有趣的项目,但我总是有实现项目系统的设计问题.

我希望游戏中的项目从一个基Item类下降,包含每个项目具有的一些属性,例如损坏和重量.当我尝试为这些项添加一些功能时,我的问题开始了.当物品的伤害超过阈值时,它应该被摧毁.我的问题就在于:我真的不知道如何实现这一目标.

由于del self不会为一百万个不同的原因,工作(:我故意提供使用"删除"作为我知道错了东西,我知道垃圾收集是什么,以及它是如何不是我想要的.编辑)如何我应该这样做(和其他类似的任务)?每个项目是否应该包含某种对它的容器的引用(我猜这个玩家)并且"要求"自己被删除?

首先想到的是一个包含游戏中每个项目的大字典,每个对象都会引用这个列表,并且都拥有并知道它自己的唯一ID.我根本不喜欢这个解决方案,我认为这不是正确的方法.有人有什么建议吗?

编辑:我看到很多人都认为我担心垃圾收集.我所说的不是垃圾收集,而是从游戏玩法中删除对象.我不确定应该启动哪些对象去除等.

python oop

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

标签 统计

haskell ×1

monads ×1

oop ×1

python ×1