You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Haskell如何正确从两个选项中随机选择?实现随机前置/追加字符到字符串

错误原因

RandomGen是类型类,属于约束范畴,不是可直接使用的具体类型,因此不能将其写在random调用的返回类型签名中。random函数的签名为(Random a, RandomGen g) => g -> (a, g),当你用它生成布尔值时,返回的二元组第二个元素的类型和你传入的生成器参数g的具体类型完全一致,因此正确的类型标注应该是(Bool, g)。

修正后代码
join :: RandomGen g => [Char] -> Char -> g -> ([Char], g)
join letters letter g = if inverse
                        then (letter:letters, newG)
                        else (letters ++ [letter], newG)
                        where (inverse, newG) = random g :: (Bool, g)
优化说明
  • 你可以省略手动类型标注,GHC可以通过上下文自动推断出random需要返回(Bool, g)类型,简化后的代码同样可正常运行:
join :: RandomGen g => [Char] -> Char -> g -> ([Char], g)
join letters letter g = if inverse
                        then (letter:letters, newG)
                        else (letters ++ [letter], newG)
                        where (inverse, newG) = random g
  • 该实现完全符合纯函数随机数的设计规范:每次调用消耗一次当前生成器状态,返回新的状态供后续随机操作使用,不会产生副作用。

内容的提问来源于stack exchange,提问作者monomonedula

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 04:57:01