乱数を使う
- こちらのMain.hsを動かす
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
- のようにして、表示内容を見ることと、以下のような記述から、ファイルのありかを見つけることでさらなる調査ができる
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