乱数を使う

import System.Random.MWC

main :: IO ()
main = withSystemRandom . asGenIO $ \gen -> do
    -- 基本的な乱数生成
    r0 <- uniform gen :: IO Int
    r1 <- uniform gen :: IO Double
    r2 <- uniform gen :: IO Bool
    print (r0, r1, r2)
    -- (6129061023494953312,0.35663084737564565,True)

    -- 範囲の決められた乱数生成
    r3 <- uniformR (1,100) gen :: IO Int
    r4 <- uniformR (0,1)  gen :: IO Double
    print (r3, r4)
    -- (88,0.40205531778476833)

    -- ランダムな文字列生成
    let randomSamples :: [a] -> Int -> IO [a]
        randomSamples xs n = map (xs!!) <$> (sequence . replicate n $ uniformR (0, length xs - 1) gen)
    r5 <- randomSamples ['a'..'z'] 10
    r6 <- randomSamples (['a'..'z']++['A'..'Z']) 10
    r7 <- randomSamples (['a'..'z']++['A'..'Z']++['0'..'9']) 10
    print (r5, r6, r7)
    -- ("zpnmprtjoh","AVZIebceLK","cjFym4gmjR")
  • stackを使う
stack new mwc-random-test
cd mwc-random-test
  • とし、import System.Random.MWC しているので、.cabalファイルのexecutableの欄のbuild-dependesにHackageに登録されているPackage名を書き加える必要がある
  • GoogleでSystem.Random.MWCを検索すると、https://hackage.haskell.org/package/mwc-random-0.13.6.0/docs/System-Random-MWC.html がヒットする。そのページの左上にパッケージ名が小さいフォントで書いてある。"mwc-random-0.13.6.0: Fast, high quality pseudo random number generation"
  • なので、mwc-randomを.cabalに書き込む
executable mwc-random-test-exe
  hs-source-dirs:      app
  main-is:             Main.hs
  ghc-options:         -threaded -rtsopts -with-rtsopts=-N
  build-depends:       base
                     , mwc-random-test
                     , mwc-random
  default-language:    Haskell2010
  • あとは以下の通り
stack install
mwc-random-test-exe
  • このようにして読み込んだパッケージの中で、フォルダ構造(今の場合はSystem/Random/MWC.hsという構造とモジュールファイル名のはず)になっているわけだが、誰かのコードを借用して、その中で使われている関数や定義タイプなどがどこに書かれているかを探すには…
:type hogefunction
:kind HogeType
:info HogeType
  • のようにして、表示内容を見ることと、以下のような記述から、ファイルのありかを見つけることでさらなる調査ができる
    • /home/ryamada/デスクトップ/gitclone/monad-bayes/src/Control/Monad/Bayes/Simple.hs:93:1

instance MonadDist m => MonadDist (Augmented m) ファイルの置き場とファイル名(Simple.hs) 、その93行目と教えてくれる

m> :info MonadDist
class (Monad m, HasCustomReal m, NumSpec (CustomReal m),
       Real (CustomReal m), Sampleable (Normal (CustomReal m)) m,
       Sampleable (Gamma (CustomReal m)) m,
       Sampleable (Beta (CustomReal m)) m,
       Sampleable (Uniform (CustomReal m)) m,
       Sampleable (Discrete (CustomReal m) Int) m) =>
      MonadDist (m :: * -> *) where
  categorical :: [(a, CustomReal m)] -> m a
  logCategorical :: [(a, LogDomain (CustomReal m))] -> m a
  bernoulli :: CustomReal m -> m Bool
  binomial :: Int -> CustomReal m -> m Int
  multinomial :: [(a, CustomReal m)] -> Int -> m [(a, Int)]
  geometric :: CustomReal m -> m Int
  poisson :: CustomReal m -> m Int
  uniformD :: [a] -> m a
  exponential :: CustomReal m -> m (CustomReal m)
  dirichlet :: [CustomReal m] -> m [CustomReal m]
  	-- Defined at /home/ryamada/デスクトップ/gitclone/monad-bayes/src/Control/Monad/Bayes/Simple.hs:93:1
instance MonadDist m => MonadDist (Augmented m)
  -- Defined at /home/ryamada/デスクトップ/gitclone/monad-bayes/src/Control/Monad/Bayes/Augmented.hs:59:10
instance MonadBayes m => MonadDist (Conditional m)
  -- Defined at /home/ryamada/デスクトップ/gitclone/monad-bayes/src/Control/Monad/Bayes/Conditional.hs:91:10
instance MonadDist m => MonadDist (Sequential m)
  -- Defined at /home/ryamada/デスクトップ/gitclone/monad-bayes/src/Control/Monad/Bayes/Sequential.hs:79:10
instance MonadDist m => MonadDist (Population m)
  -- Defined at /home/ryamada/デスクトップ/gitclone/monad-bayes/src/Control/Monad/Bayes/Population.hs:85:1