我有以下类型的结构:
-- 'root':
data Skill a = Skill {rate :: a, spawns :: Actor a}
deriving (Show, Read, Functor)
data Actor a = Area {appl :: Actor a, radius :: a}
| Projectile {appl :: Actor a, speed :: a, projDuration :: Double}
| Hit [Effect a]
deriving (Show, Read, Functor)
data Effect a = Damage [(a, a, Tag)]
-- | ...
deriving (Show, Read, Functor)
这些类型是我对该想法最直观的描述(a
大多数情况下只是Num
类型)。我现在的问题是,这些类型中的每一种都有Properties
,并且我想要使用eval :: Properties -> a -> b
沿着所有a
向数据结构中的所有Properties
应用函数-- for example
data Skill a = Skill {props :: Properties, rate :: a, ...}
data Actor a = Area {props :: Properties, appl :: ...}
方式。
Properties
这些Prop a = Prop Properties a
与实际结构关系不大,可以应用于任何事物。对我来说这听起来应该是:
StateT
我尝试使用eval
在一个更简单的树上保存和分配属性(所有类型总结为一个...)但是这使得使用该结构令人不愉快的'。我可以为data Properties = [Int]
创建一个类型类,但这感觉不对,因为实例只会传递属性。
我的目标是将Skill / Actor / ...描述的结构与Properties的行为分开,以便更改要么不需要更改与另一个相关的代码,但我不知道哪个工具为了达到或者如果我让它变得比它需要的更复杂。
(如果你能确定我在这里挣扎的话,请随意更改标题......)
编辑:(这将是很多代码设置......)
给定a
,
Effect
中的元素[6]
,其中包含(属性)Actor
在[10]
Skill
在[1,3]
[1,3,10,6]
必须使用整个列表// Example program
#include <iostream>
#include <string>
#include <math.h>
int r, odd_divisors(int a, int b);
int odd_divisors(int a, int b) {
r = sqrt(b) + 1;
r -= sqrt(a);
return 0;
}
int main()
{
odd_divisors(16,25);
std::cout << "Hello, " << r;
}