我是Haskell的新手,所以對編碼風格我不太瞭解。我有一個鏈接很多隨機生成器的函數。這種代碼是否被認爲是不好的風格,在where
陳述之後我有10行?如果是這樣,有什麼選擇?正在使用long where語句不良的編碼風格?
#!/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
由於這可能是有些主觀的問題,請剋制答案relfect Haskell的社區代碼風格規範,而不是個人的意見/美學。
我知道使用getStdRandom
的可能性,但希望在此使用純函數。
「這種代碼是否被認爲是糟糕的風格,其中我在where語句之後有10行?」。不一定,但是沒有名稱在範圍之內的地方是一個很好的經驗法則。你真正想要做的是功能組合(在這種情況下,用「State」構成的功能組合的更好的形式將是合適的)。所以我猜如果你在where子句中發現自己綁定的名字並從上到下使用它們,意識到你可能正在尋找某種合成 – jberryman
@jberryman你可能提供了一些其他類型的使用狀態組合的例子? – Langston
那麼,從Control.Monad''中涉及的特定類型的組合不是'(。)',而是'<= <'。它將單子計算結合在一起。在這種情況下,和其他許多情況一樣,最好是在「do」表達式中更明確地將事情串在一起。 – dfeuer