堆叠多态性

时间:2016-05-21 15:32:57

标签: haskell polymorphism

我有以下类型的结构:

-- '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的行为分开,以便更改要么不需要更改与另一个相关的代码,但我不知道哪个工具为了达到或者如果我让它变得比它需要的更复杂。

(如果你能确定我在这里挣扎的话,请随意更改标题......)

编辑:(这将是很多代码设置......) 给定aEffect中的元素[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; }

进行评估

0 个答案:

没有答案