gpt4 book ai didi

haskell - 为什么随机类没有最小完整定义

转载 作者:行者123 更新时间:2023-12-04 18:11:08 24 4
gpt4 key购买 nike

This page声明 Random 类的最小完整定义是“Nothing”
但如果我不提供它们,它们就不起作用:

data Color = Red | Blue deriving (Bounded, Show)

instance Random Color
产生编译器警告:
test.hs:5:10: warning: [-Wmissing-methods]
• No explicit implementation for
‘randomR’ and ‘random’
• In the instance declaration for ‘Random Color’
|
5 | instance Random Color
当我运行代码时出现错误:
*Main> let g = mkStdGen 100
*Main> (fst $ random g) :: Color
*** Exception: test.hs:5:10-21: No instance nor default method for class operation random
为什么不是 randomrandomR在最小完整定义下列出?

最佳答案

这是个好问题。答案是:您使用的是旧版本的 random , 因为从 random-1.2 开始您的代码将无法编译并会产生编译时错误,如下所示:

    • Could not deduce (UniformRange Color)
arising from a use of ‘System.Random.$dmrandomR’
from the context: RandomGen g
bound by the type signature for:
randomR :: forall g.
RandomGen g =>
之前 random-1.2 random 以前没有实现和 randomR , 所以 compiler required implementation for those functions以编译警告的形式。但是,从 random-1.2 开始,有一个使用 DefaultSignatures 的默认实现。扩展名,这意味着您的 instance Random Color将在不显式实现 random 的情况下编译和 randomR仅当您的类型也有 UniformUniformRange实例。因此,编译器不再显示 randomrandomR按要求。
编辑
random-1.2.1 开头您可以使用不错的辅助函数 uniformEnumM 创建一个实例和 uniformEnumRM :
import System.Random.Stateful

data Color = Red | Blue deriving (Bounded, Enum, Show)

instance Uniform Color where
uniformM = uniformEnumM

instance Uniform Color where
uniformRM = uniformEnumRM

instance Random Color

关于haskell - 为什么随机类没有最小完整定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69339239/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com