如何提高多参数的类似函数的可读性?

Mic*_*ron 2 haskell functional-programming readability

我做了这个功能:

-- Generates multiple random values
randoms :: (Random a) => StdGen -> Int -> a -> a -> ([a], StdGen)
randoms rndGen nbrsCount min max = randomNbrs' nbrsCount min max ([], rndGen) where
    randomNbrs' rndGen 0 min max cumul = cumul
    randomNbrs' rndGen count min max cumul = randomNbrs' rndGen (count-1) min max (values, snd rndGen') where
        rndGen' = randomR (min, max) rndGen
        values = fst rndGen' : values
Run Code Online (Sandbox Code Playgroud)

而且难以阅读.因为我是Haskell的新手,所以我无法找到如何提高其可读性.如何使这更容易阅读和更简洁?

Nic*_*las 7

我真的很喜欢MonadRandom在这些情况下使用:

import Control.Monad.Random

randomsR :: (Random a, RandomGen b) => b -> Int -> a -> a -> ([a], b)
randomsR gen nb min max = flip runRand gen        -- run the random monad
                          . sequence              -- get the random monad out of the list
                          . replicate nb          -- generate nb values
                          $ getRandomR (min, max) -- the generator for one value
Run Code Online (Sandbox Code Playgroud)

你也可以缩短它(感谢Ørjan):

randomsR :: (Random a, RandomGen b) => b -> Int -> a -> a -> ([a], b)
randomsR gen nb min max = flip runRand gen
                          . replicateM nb
                          $ getRandomR (min, max)
Run Code Online (Sandbox Code Playgroud)

要么

randomsR :: (Random a, RandomGen b) => b -> Int -> a -> a -> ([a], b)
randomsR gen nb min max = flip runRand gen
                          . fmap (take nb)
                          $ getRandomRs (min, max)
Run Code Online (Sandbox Code Playgroud)