小编the*_*heo的帖子

为什么 IsList 需要 toList?

使用时-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必须满足条件,但是对于某些类型(例如无序集合,它不能保证元素的顺序保持不变),这根本无法保证。

这似乎非常不一致。

haskell overloaded-strings overloaded-lists

9
推荐指数
1
解决办法
149
查看次数

Haskell 数据类型的非均匀分布

随机包包含一个类型的类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可能低于其他值。但是从该类型的所有值的集合中提取值的概念仍然相同RarityDropType这就是为什么这对我来说看起来像是类型类的工作。

random haskell non-uniform-distribution

6
推荐指数
1
解决办法
94
查看次数

总和类型 vs. 类型类 vs. 记录

以下三种方法中哪一种最适合为 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)

haskell typeclass algebraic-data-types

5
推荐指数
1
解决办法
119
查看次数