【问题标题】:Haskell type error: Type : a Int, Does not match : IntHaskell 类型错误:类型:一个 Int,不匹配:Int
【发布时间】:2012-02-05 15:34:07
【问题描述】:

我需要生成一个从 1 到 5 的随机数,该随机数不在传递的列表中。

这是我的代码:

questionNumberGenerator:: [Int]->Int
questionNumberGenerator ql = do
    g <- newStdGen
    let qn=(fst((randomR (1, 5) g)))::Int
    let element = (elem qn ql)::Bool
    if(element==True)
        then
           questionNumberGenerator ql
        else do
           return qn

我做错了什么?

【问题讨论】:

    标签: haskell typeerror


    【解决方案1】:

    问题是你的类型签名;应该是:

    questionNumberGenerator :: [Int] -> IO Int
    

    questionNumberGenerator 返回一个 IO 操作(它必须,才能使用全局随机数生成器),但您的类型签名说它是纯的。

    如果您想在纯代码中使用questionNumberGenerator,则必须显式地线程化随机数生成器状态,如下所示:

    questionNumberGenerator :: (RandomGen g) => [Int] -> g -> (Int, g)
    questionNumberGenerator ql g =
        let (qn, g') = randomR (1, 5) g
            element = elem qn ql
        in if (element==True)
               then questionNumberGenerator ql g'
               else (qn, g')
    

    顺便说一句,(element==True) 是多余的; element 的意思完全一样。

    【讨论】:

      猜你喜欢
      • 2018-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-14
      • 1970-01-01
      • 2022-08-02
      相关资源
      最近更新 更多