【问题标题】:Trouble translating small C# "Random String" function to Haskell将小型 C#“随机字符串”函数转换为 Haskell 时遇到问题
【发布时间】:2017-04-11 16:38:37
【问题描述】:

我在我公司的代码库中看到了以下代码,并心想“该死的,这是一条很好的 linq,我想把它翻译成 Haskell,看看它在实际的函数式语言中是什么样的”

static Random random = new Random();
static string RandomString(int length)
{
    const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    return new string(Enumerable.Repeat(chars, length)
                                .Select(s => s[random.Next(s.Length)])
                                .ToArray());
}

但是,由于在这种语言中生成随机数是多么尴尬,所以我在将简明直接的翻译成 Haskell 时遇到了一些麻烦。

我考虑了几种方法。 C# 代码的最直接翻译只生成一个随机索引,然后使用它来代替random.Next(s.Length)。但是我需要生成多个索引,而不是一个。

然后我考虑做一个IO Int 随机数操作列表,但我不知道如何通过并将IO 操作列表转换为实际随机数。

因此,与 C# 相比,我最终编写的 Haskell 代码看起来非常复杂(在这种情况下我没有预料到),而且我什至还没有让它工作。

我的问题,C# 到 Haskell 的自然翻译是什么?或者更一般地说,您将如何在 Haskell 中生成指定长度的随机字符串(因为这种 C# 方式似乎不能很好地转换为 Haskell)?

注意:我主要对 Haskell 中生成随机字符串的算法感兴趣。我对任何可以为我完成这项工作的标准库并不真正感兴趣

【问题讨论】:

    标签: c# string linq haskell random


    【解决方案1】:

    Haskell 的自然翻译涉及到某种IO(因为你需要随机性)。由于您实际上是在尝试执行选择字符n 次的操作,因此您想使用replicateM。然后,要获取一个范围内的随机数,您可以使用randomRIO。

    import Control.Monad (replicateM)
    import System.Random (randomRIO)
    
    randomString :: Int -> IO String
    randomString n = replicateM n (do r <- randomRIO (0,m); pure (chars !! r))
      where
        chars = ['A'..'Z'] ++ ['0'..'9']
        m = length chars
    

    这有点复杂,因为您想要一个只有特定范围内的字符的字符串。否则,您将只有一个班轮:randomString n = replicateM n randomIO。


    也就是说,更忠实的翻译会使用conduit。我不打算包括导入和语言编译指示(因为它们有点痛苦)。这看起来更像是用 C# 编写的:

    randomString' :: Int -> IO String
    randomString' n = runConduit $ replicate n chars
                                .| mapM (\cs -> do r <- randomRIO (0,m); pure (cs !! r))
                                .| sinkList
      where
        chars = ['A'..'Z'] ++ ['0'..'9']
        m = length chars
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多