- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以下三种方法中哪一种最适合在 RPG 中实现某种稀有元素?
总和类型的方法“感觉”它是正确的,因为稀有物看起来像一个“封闭的集合”(或不可变的?如果这是正确的话)。
但是,如果这是在库中定义的,那么我将无法添加更多稀有的东西,这似乎很奇怪。
data Rarity = Rarity { symbol :: String, value :: Int }
common = Rarity "C" 1
rare = Rarity "R" 2
legendary = Rarity "L" 3
data Rarity = Common | Rare | Legendary
symbol :: Rarity -> String
symbol Common = "C"
symbol Rare = "R"
symbol Legendary = "L"
value :: Rarity -> Int
value Common = 1
value Rare = 2
value Legendary = 3
class Rarity r where
symbol :: r -> String
value :: r -> Int
data Common = Common
instance Rarity Common where
symbol _ = "C"
value _ = 1
data Rare = Rare
instance Rarity Rare where
symbol _ = "R"
value _ = 2
data Legendary = Legendary
instance Rarity Legendary where
symbol _ = "L"
value _ = 3
最佳答案
您展示的类型类方法在实践中不是很符合人体工程学。
大概您希望拥有具有稀有属性的元素。但是稀有字段应该是什么类型? Common
, Rare
, 和 Legendary
都是独立的类型,所以你不能只拥有 data Item = Item { ..., rarity :: Rarity }
(更不用说客户端程序添加的假设的额外稀有级别,如果这是在库中)。
你可以有data Item r = Item { ..., rarity :: r }
,但现在项目列表(或任何其他通用集合)的类型必须指定其中所有项目的单一稀有度级别(例如 [Item Common]
)。这不是您在实践中想要使用稀有度的方式(因为例如玩家的库存可以包含不同稀有度的元素!)。
您可以通过使用存在类型来解决这个问题:
{-# LANGUAGE GADTs #-}
data Item
where Item :: Rarity r =>
{ ...
, rarity :: r
}
-> Item
但是现在这基本上与您的第一个提案(使用
data Rarity = Rarity { symbol :: String, value :: Int }
)同构,只是使用起来更加复杂。因为你不能对一个被限制在
Rarity
中的未知类型的值做任何事情。调用类型以外的类别
Rarity
方法,所有这些都会为您提供
String
和
Int
,您可能刚刚使用了
String
的记录和
Int
首先,保存所有的扩展和样板。
String
和
Int
这构成了一个稀有级别。如果您可以真正在您的 RPG 库中编写引擎代码来处理它们之间的任何属性的完全不可知论,那么记录就是正确的方法。但我的直觉是 RPG 稀有级别,你不会那样做。你将依赖一个排序,你将依赖一个给定的
String
对应相同的稀有代码
Int
每次看到它的值(value),等等。
class Rarity r where
symbol :: r -> String
value :: r -> Int
data GameOneRarity = Common | Rare | Legendary
instance Rarity GameOneRarity
where symbol Common = "C"
symbol Rare = "R"
symbol Legendary = "L"
value Common = 1
value Rare = 2
value Legendary = 3
data GameTwoRarity = Boring | Cool | Awesome
instance Rarity GameTwoRarity
where symbol Boring = "B"
symbol Cool = "C"
symbol Awesome = "A"
value Boring = 100
value Cool = 1000
value Awesome = 10000000
我没有为每个新稀有度设置单独的类型
级别 ,我为每个稀有度都有一个单独的类型
方案 .这个想法是让每个游戏都定义自己的稀有度类型。一组单独的稀有度是不可扩展的,但库代码可以处理具有游戏设计师想要的任何稀有度级别的任意方案(只要他们可以为它们实现
symbol
和
value
)。
[Item r]
这样的类型。确保它考虑的所有元素一起使用相同的稀有度系统(避免必须回答不明智的问题,例如一个游戏中的传奇元素是否比不同游戏中的酷元素更有值(value)或更少)但是在该系统中,每个项目都可以有自己的稀有度。
关于haskell - Sum Types vs. Type Classes vs. Records,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66769775/
我只想知道它们之间的区别: .class .class{ font-size:14px; } 对比: .class > .class{ font-size:14px; } 是一样的东西吗? 最佳答案
PrimeFaces 文档的以下摘录使标题中描述的两个选择器之间似乎存在差异: .ui-widget, .ui-widget .ui-widget { font-size: 90% !imp
我正在尝试选择特定值。但我遇到了一个问题。 我有两个元素,一个有 X Y,另一个有 X Y Z。 当选择 X Y Z 时,我也收到 X Y 的值...有没有办法让它寻找 X AND Y AND Z 而
.class.class 和 .class .class 有什么区别? 最佳答案 .class .class 匹配类 .class 的任何元素,这些元素是类 .class< 的另一个元素的后代/. .
我正在研究 Classname.class 和 Classname.class.toString() 并发现了一些不寻常的东西。 .class 在同一个类上运行时似乎等同于 .class。尽管 .cl
我试图在Dart中扩展列表并在此列表中使用另一个类。 这是我的示例,其中注释出了问题: import "Radio.dart"; // extends ListBase { List ra
我有一个很大的“经理”类,我认为它做得太多了,但我不确定如何将它划分为更多逻辑单元。 一般来说类主要由以下方法组成: class FooBarManager{ GetFooEntities();
我在一个文件中定义了一个抽象父类(super class),在另一个文件中定义了一个子类。我需要父类(super class)文件和堆栈跟踪报告来找到一个包含它。 但是,当它到达“extends”行时
我在 A. Alexenderscu 的现代 C++ 设计中找到了一些模板示例 作者使用以下行的地方 template class CheckingPolicy // class SmartPt
看一下这段代码: public static class A { public void doA() { } } public static class B extends A {
我有两个具有 .body 类的 div,但是,一个位于另一个具有 .box 类的 div 中 - 如下所示: 我只想为 .box 内部的 .body 设置样式...但我在下面所
我一定是遗漏了 C++ 规范中的某些内容,因为我无法解释为什么以下代码可以成功编译: class MyClass { static void fun(); }; int main() { MyClas
我正在尝试在 python 中“模拟”命名空间。我使用内部和外部类层次结构来创建我的命名空间。例如,您希望将文件(如资源)的路径保存在一个位置。我试过这样的事情: src = #path to sou
在试验 online crystal compiler 时(这太棒了),我遇到了一个我似乎无法找到解释的错误: class Person class Current < self end
在查看我的一段代码时,我陷入了如下的一条语句。 TMyObjectClass = TMyObject 类; 我有点困惑,不知道这句话是什么意思。由于 TMyObjectClass 在该语句上方没有声明
我正在编写一个简单的应用程序,以学习一些基本的Dart编程,但无法弄清楚其结构和包含的内容-我得到了一个重复的类Point 首先,我有一个叫做MouseTrack的主类。它将初始化列表并产生循环。 #
在 org.springframework.core.SerializableTypeWrapper (版本 5.2.3),第 112 行有以下代码: if (GraalDetector.in
我希望将鼠标悬停在子导航中的列表项上,以激活页面上该类别中所有项的类(不仅仅是父元素或同级元素)。有任何想法吗?这是我的意思的一个例子: img.BLUE {border:1px solid #FF
我正在通过 ClassLoader 加载类: Class clazz = urlClassLoader.loadClass(name.substring(0, name.length() - 6).r
以下简化的类在从 get() 返回值时执行不同的操作,具体取决于该类是被赋予 double 值还是数组作为模板参数: #include "array" #include "type_traits" t
我是一名优秀的程序员,十分优秀!