我是Haskell新手,所以我对编码风格不太了解。我有一个链接许多随机生成器的函数。这种代码是否被认为是不好的样式,其中在where语句后大约有10行?如果是这样,有哪些替代方案?

#!/usr/bin/env runhaskell
{-# LANGUAGE UnicodeSyntax #-}
module Main where

makeDummy :: RandomGen g ⇒ [String] → FilePath → g → (FilePath, g)
makeDummy words root gen0 = (fullPath, gen7)
  where
      (numWordsInTitle, gen1) = randomR (1 :: Int, 4 :: Int) gen0 -- unused
      (title, gen2) = randomChoice words gen1
      (year, gen3) = randomR (1800 :: Int, 2100 :: Int) gen2
      (resNum, gen4) = randomChoice ["1080", "720", "480"] gen3
      (resLetter, gen5) = randomChoice ["P", "p", "i", "I"] gen4
      res = resNum ++ resLetter
      (shuffled, gen6) = shuffle [title, show year, resNum ++ resLetter] gen5
      (fileExt, gen7) = randomChoice [".mkv", ".mp4", ".ogv", ".srt", ""] gen6
      path = (++ fileExt) $ intercalate " " shuffled
      fullPath = root </> path

由于这可能是一个有点主观的主题,请限制答案以影响Haskell社区代码风格规范,而不是个人意见/美学。

我知道可以使用getStdRandom,但最好在这里使用纯函数。

最佳答案

是的!在这种情况下,状态monad(或更确切地说是随机性monad)非常方便。这些使您可以将所有可以转换某种状态的计算链接在一起,在本例中为随机种子。例如,参见Control.Monad.State或寻找MonadRandom

关于haskell - 使用长where语句的编码风格不好吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31495362/

10-13 00:11