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
相关产品推荐
相关产品推荐

