小编hip*_*afe的帖子

为什么我们不能在Haskell中为枚举派生Random类实例?

我今天写了这个:

data Door = A | B | C
 deriving (Eq,Bounded,Enum)

instance Random Door where
 randomR (lo,hi) g = (toEnum i, g')
  where (i,g') = randomR (fromEnum lo, fromEnum hi) g
 random = randomR (minBound,maxBound)
Run Code Online (Sandbox Code Playgroud)

我认为这对于任何枚举都是大致可复制的.我尝试将Random放入derinding子句中,但是失败了.

然后我搜索了网络,发现了这个:

请为随机#21提供(Enum a,Bounded a)的实例

一些引用似乎回答了我的问题,除了我不太了解它们:

你有什么实例,实例(Bounded a,Enum a)=>随机a在哪里......?不可能有这样的实例,因为它会与其他所有实例重叠.

这将阻止任何用户派生的实例....

为什么不能通过derinding子句或至少使用默认实现来实现自动化.

为什么这不起作用?

instance (Bounded a, Enum a) => Random a where
   randomR (lo,hi) g = (toEnum i, g')
       where (i,g') = randomR (fromEnum lo, fromEnum hi) g
   random = randomR (minBound,maxBound)
Run Code Online (Sandbox Code Playgroud)

enums haskell typeclass deriving

2
推荐指数
1
解决办法
131
查看次数

标签 统计

deriving ×1

enums ×1

haskell ×1

typeclass ×1