gpt4 book ai didi

haskell - Haskell 中的随机十六进制 ID

转载 作者:行者123 更新时间:2023-12-04 16:01:55 26 4
gpt4 key购买 nike

我是 Haskell 和硬 FP 的新手。我一直在尝试想出一个可以为我的项目生成特殊类型 ID 的函数。 ID 有 4 组 8 位数字。前两组总是零,另外两组是随机的 8 位十六进制数。这是我想出的代码,但它似乎调用了很多东西来实现一个简单的结果。执行此类操作的正确 Haskell 方法是什么?

import Data.List (intercalate)
import System.Random (randomRIO)
import Numeric (showHex)

deviceId :: IO String
deviceId = sequence [zeros, zeros, bits, bits] >>= return . intercalate "-"
where zeros = return "00000000"
bits = randomRIO (0x10000000::Integer, 0xffffffff::Integer) >>= return . flip showHex ""

编辑:感谢评论,我的函数现在使用 fmap 并且看起来像这样

deviceId :: IO String
deviceId = intercalate "-" <$> sequence [zeros, zeros, bits, bits]
where zeros = return "00000000"
bits = flip showHex "" <$> randomRIO (0x10000000::Integer, 0xffffffff::Integer)

零返回对我来说很有意义,因为它清楚地表明我们正在对 IO 字符串进行操作。谢谢。还有其他改进吗?

最佳答案

您可以使用随机字符串包来处理随机值和渲染:

% git clone https://github.com/TomMD/random-string
Cloning into 'random-string'...
remote: Counting objects: 12, done.
remote: Total 12 (delta 0), reused 0 (delta 0), pack-reused 12
Unpacking objects: 100% (12/12), done.
% cd random-string
% cabal new-repl
Resolving dependencies...
> import Data.List
> let zeros = pure $ replicate 8 '0'
> let rnd = randomString (StringOpts Base16 4)
> (intercalate "-") <$> sequence [zeros,zeros,rnd,rnd]

也就是说没有导入的解决方案与您已有的解决方案非常相似:

f = intercalate "-" <$> sequence [z,z,r,r]
where z = pure (replicate 8 '0')
r = randomString (StringOpts Base16 4)

注意我的解决方案的范围与您的不同。我假设您随机选择了 0x10000000-0xFFFFFFFF 只是因为您想要完整渲染的 8 个字符并且不想或不知道如何渲染前导零。如果您想在范围内配对,那么随机字符串包可能比值(value)更麻烦。

关于haskell - Haskell 中的随机十六进制 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50238367/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com