【问题标题】:Haskell: How to do a generic random function?Haskell:如何做一个通用的随机函数?
【发布时间】:2014-08-21 22:42:54
【问题描述】:

我正在尝试创建一个返回随机值的通用函数。我可以让一个为浮点数工作,然后另一个为整数工作......就像这样:

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)

【问题讨论】:

    标签: generics haskell functional-programming signature purely-functional


    【解决方案1】:

    :: (a, StdGen) 中的 a 与函数类型签名中的 a 不同。只需删除 :: (a, StdGen) 即可。

    更一般地说,如果您想/需要在这样的表达式的注释中使用类型变量,则需要启用GHC's ScopedTypeVariables extension

    【讨论】:

    • @MickaelBergeronNéron 当你定义这个函数时,Haskell 推断它有一个多态类型,可以用于多个a。但是当您真正使用它时,必须选择一种特定类型。 Haskell 将尝试从您如何使用它来推断您需要什么类型,或者如果失败尝试选择默认值,但没有扩展 Random 不能被默认。在最近的 GHCi 版本中,ExtendedDefaultRules 应用并且您不需要需要指定返回类型,例如对于randomR (1,3) (mkStdGen 42)
    • 我看到你在我打字的时候删除了你的问题评论,所以我想你明白了;在上面留下我的评论,以防它帮助某人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    • 2020-09-28
    • 2011-02-18
    相关资源
    最近更新 更多