首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >哈斯克尔--我该如何管理一份州单元组的名单?

哈斯克尔--我该如何管理一份州单元组的名单?
EN

Stack Overflow用户
提问于 2017-05-26 03:58:34
回答 1查看 702关注 0票数 4

我对Haskell有点陌生,而且我对“国家单曲”有一些麻烦。

我已经创建了以下类型。Stat a有一个为它创建的一元、函子、应用程序和单实例。

在我的程序中,“主要”类型是“生物”,它有许多论点:

代码语言:javascript
复制
data Creature = Creature {
    strength  :: Stat Integer,
    dexterity :: Stat Integer,
    ...
}

data Stat a = Stat {
    modifiers :: [StatModifier],
    stat      :: a
}

data StatModifier = StatModifier {
    modifierType :: ModifierType,
    value        :: Integer
}

data ModifierType = 
  Enhancement
  | Morale
  | ...

有很多事情会发生在一个生物身上。我选择用“国家单子”来代表这些东西:

代码语言:javascript
复制
anyPossibleChange :: State Creature Creature

这可能是对生物造成的伤害,增加了生物的力量,基本上是任何东西。任何事情的可能性都让我觉得国家的单子在这里是个不错的选择。我将接受处于原始状态的生物,执行一些修改,并以元组的形式返回原始状态和新状态。

最初的状态可能是:

代码语言:javascript
复制
Creature {
    strength = Stat [] 10,
    dexterity = Stat [] 10
}

结束状态可能是:

代码语言:javascript
复制
Creature {
    strength = Stat [StatModifier Enhancement 2] 10,
    dexterity = Stat [StatModifier Enhancement 4, StatModifier Morale 2] 10
}

我想建立一个名单,所有的改变,一个生物需要通过,然后运行的生物通过所有这些变化。

这是我想要的签名,但是我想不出一个实现。我对此持开放态度。

代码语言:javascript
复制
applyChanges :: Creature -> [State Creature Creature] ->  Creature

我觉得我应该可以用折叠式(可能是FoldM )来完成这个任务,但我的大脑正被这些类型所困扰。

什么是好的实施?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-26 15:32:29

State Creature Creature是这种计算的错误类型。正如您所看到的,您可以不使用它,但是它不必要地使事情复杂化,因为您实际上根本不关心状态变量!您只需使用它来存储函数的原始input...but,然后将其丢弃在applyChanges中。

一个更容易使用的类型是Creature -> Creature,然后如果您有要应用的这些函数的列表,那么您只需要组合它们,就可以使用折叠:

代码语言:javascript
复制
applyChanges :: [Creature -> Creature] -> Creature -> Creature
applyChanges = foldr (.) id
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44193347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档