使用时-XOverloadedStrings你可以实现IsString只需要一个函数fromString。现在,如果您想使用字符串文字进行模式匹配,您还必须实现Eq,这是有道理的:
f :: MyString -> Bool
f "foo" = True
f _ = False
-- equivalent to
f x
| x == fromString "foo" = True
| otherwise = False
Run Code Online (Sandbox Code Playgroud)
但是,为什么使用的IsList类型类-XOverloadedLists需要您实现toList?在wiki 中,唯一提到的用例toList是模式匹配。我知道这Eq对于列表模式匹配是不够的。但后来toList应该是在唯一需要不同类型的类,如果你想使用列表模式匹配与你的类型,就像IsString没有要求 Eq。
对我来说,令人讨厌的事情是fromList . toList = id必须满足条件,但是对于某些类型(例如无序集合,它不能保证元素的顺序保持不变),这根本无法保证。
这似乎非常不一致。
的随机包包含一个类型的类Uniform为均匀分布的类型。这适用于以下类型:
data Coin = Heads | Tails
Run Code Online (Sandbox Code Playgroud)
但是假设我想对一组具有非均匀分布的事物进行建模,例如通过添加硬币落在其一侧的可能性:
data Coin = Heads | Tails | Side
Run Code Online (Sandbox Code Playgroud)
现在我仍然可以Uniform在其实现中使用非均匀分布来实现,但这会欺骗Uniform.
我是否必须只使用一个独立的函数,或者是否有一些类型类用于“实际”分布的概念?
这个类型类在 RPG 的上下文中很有用,在那里你可以有一些类型
data Rarity = Common | Rare
data DropType = Club | Sword
Run Code Online (Sandbox Code Playgroud)
获得 aRare和它是 a的机会Sword可能低于其他值。但是从该类型的所有值的集合中提取值的概念仍然相同Rarity,DropType这就是为什么这对我来说看起来像是类型类的工作。
以下三种方法中哪一种最适合为 RPG 中的物品实现某种稀有性?
sum 类型的方法“感觉”是正确的,因为稀有性似乎是一个“封闭集”(或不可变的?idk,如果这是正确的词)。但是,如果这是在图书馆中定义的,那么我将无法添加更多看起来很奇怪的稀有物品。
data Rarity = Rarity { symbol :: String, value :: Int }
common = Rarity "C" 1
rare = Rarity "R" 2
legendary = Rarity "L" 3
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
class Rarity r where
symbol :: …Run Code Online (Sandbox Code Playgroud)