Generics 哈斯克尔:如何做一个普通的随机函数?

Generics 哈斯克尔:如何做一个普通的随机函数?,generics,haskell,functional-programming,signature,purely-functional,Generics,Haskell,Functional Programming,Signature,Purely Functional,我试图创建一个返回随机值的泛型函数。我可以让一个为浮动工作,然后是另一个为整数工作。。。像这样: randomFloat :: StdGen -> Float-> Float-> (Float, StdGen) randomFloat rndGen min max = randomR (min, max) rndGen :: (Float, StdGen) randomInt :: StdGen -> Int-> Int-> (Int, StdGen) ra

我试图创建一个返回随机值的泛型函数。我可以让一个为浮动工作,然后是另一个为整数工作。。。像这样:

randomFloat :: StdGen -> Float-> Float-> (Float, StdGen)
randomFloat rndGen min max = randomR (min, max) rndGen :: (Float, StdGen)

randomInt :: StdGen -> Int-> Int-> (Int, StdGen)
randomInt rndGen min max = randomR (min, max) rndGen :: (Int, StdGen)
但我希望有一个适用于任何相关变量类型。我怎么做?到目前为止,我有这个,但这不起作用:

randomNbr :: (Random a) => StdGen -> a -> a -> (a, StdGen)
randomNbr rndGen min max = randomR (min, max) rndGen :: (a, StdGen)

:(a,StdGen)
中的
a
与函数的类型签名中的
a
不同。只要删除
:(a,StdGen)
,它就会工作


更一般地说,如果您希望/需要在类似表达式的注释中使用类型变量,则需要启用。

您的
中的
a
:(a,StdGen)
与函数的类型签名中的
a
不相同。只要删除
:(a,StdGen)
,它就会工作


更一般地说,如果您希望/需要在类似表达式的注释中使用类型变量,则需要启用。

@Mickelbergeronnéron当您定义此函数时,Haskell推断它具有可用于多个
a
的多态类型。但当你实际使用它时,必须选择一种特定的类型。Haskell将尝试从您如何使用它来推断您需要什么类型,或者如果失败,则尝试选择一个默认值,但如果没有扩展名,则
Random
不能被默认。在最近的GHCi版本中,
ExtendedDefaultRules
适用,您不需要指定返回类型,例如,
randomR(1,3)(mkStdGen 42)
。我看到您在键入时删除了您的问题注释,所以我想您已经找到了答案;在上面留下我的评论,以防对某人有所帮助。@Mickaelbergeronéron当您定义此函数时,Haskell推断它有一个多态类型,可以用于多个
a
。但当你实际使用它时,必须选择一种特定的类型。Haskell将尝试从您如何使用它来推断您需要什么类型,或者如果失败,则尝试选择一个默认值,但如果没有扩展名,则
Random
不能被默认。在最近的GHCi版本中,
ExtendedDefaultRules
适用,您不需要指定返回类型,例如,
randomR(1,3)(mkStdGen 42)
。我看到您在键入时删除了您的问题注释,所以我想您已经找到了答案;在上面留下我的评论,以防对某人有所帮助。