为什么Haskell的Random类无最小完整定义却要求实现random和randomR
问题原因
- 你遇到的是
random-1.2.x版本的接口重构带来的文档表述歧义问题:- 该版本将原
Random类的核心逻辑拆分到了新增的Uniform、UniformRange两个类型类中,文档标注的「最小完整定义为无」,指的是如果你为目标类型实现了上述两个新类型类的实例,Random类的random、randomR方法可以自动获得默认实现,不需要额外写代码。 - 如果你没有实现
Uniform、UniformRange实例,就必须手动实现random和randomR两个方法,否则就会触发你收到的编译告警和运行时异常。
- 该版本将原
- 你的
Color类型已经派生了Bounded,只需要补充派生Enum类,就可以直接使用内置的通用实现,无需手动编写方法逻辑,修改后的代码如下:
data Color = Red | Blue deriving (Bounded, Enum, Show) instance Random Color where randomR = randomREnum random = randomEnum
如果开启DeriveAnyClass扩展,还可以进一步简化为:
{-# LANGUAGE DeriveAnyClass #-} data Color = Red | Blue deriving (Bounded, Enum, Show, Random)
内容的提问来源于stack exchange,提问作者bwroga
相关产品推荐
相关产品推荐

