Haskell

Random

mainの中でmkStdGenするぎりぎりまでIOモナドで包まない、ってのにチャレンジしてみた。 import Random dice :: (RandomGen g) => g -> (Int, g) dice g = randomR (1, 6) g dice_seq :: (RandomGen g) => g -> [Int] dice_seq g = let first_result = dice …

続き

破壊的更新をするにはControl.Monad.STを使うといいらしい。 by id:pi8027ST Monad examples - Data.Random

続き

[count_n (next_turn game) [(step_game game play) >> (while_game_finished select_ai_for_monte) | _ <- [1..100]] | play <- hands] この時点でそれぞれの着手選択肢について着手した後ゲームが終わるまで100回実行した結果、勝ったのが自分である回数の…

ポイントフリー

Twitterから転載 ラムダ使わずにプログラム書くの難しい。一つの値を名前に束縛せずに複数箇所で使うってどうやるんだ。Sコンビネータ的なものが用意されてる? Control.ApplicativeにSコンビネータあった →Control.ApplicativeのがSコンビネータだと書いて…

昨日の続き

@pi8027 あともっと fold とか使ってくれないと読めません。本物の Haskeller は再帰もラムダ式もあまり使わない! @pi8027 countM a l = sequence l >>= return.length.filter (a==) なるほど。sequence で[IO Int]がIO [Int]になって、 >>= f で fに[Int]が…

IOモナドのリスト

IO Intが100個入っているリストがあるんですが、Intが1の物の個数を調べるにはどうしたらいいのでしょう。こんな関数を作ったらIOなんてデータコンストラクタはないと言われました。 won :: IO Int -> Int -> Bool won (IO x) y = (x == y) The monad laws I…

昨日の続き

ゲームと着手を受け取って、更新した新しいゲームを返す関数と、ゲームを受け取ってゲームが終わったかどうかと誰が勝ったのかを返す関数を作った。 -- ゲームと着手を受け取って、更新した新しいゲームを返す step_game :: Game -> Play -> IO Game step_ga…

モジュール

うまくいかない。これでimport Aとimport Bを切り替えることで挙動が変わります、ってのをやりたかったんだけど「module B where」の冒頭でパーサーエラーだ。 module A where newtype Foo = MakeFoo {foo :: Integer} newtype Bar = MakeBar {bar :: String…

昨日の続き

モジュールに分けてetcはまた先でも出来るだろうからほっといて進もう T3GameとT3Playを作るのはやめて、GameとPlayにした。 -- ゲームの局面を受け取って選択可能な手のリストを返す possible_hands :: Game -> [Play] possible_hands game = [MakePlay i |…

昨日の続き

眠いけどこれだけは書き残しておかねば。 昨日のこの問題: ... is a rigid type variable bound by ... この記事でOCamlのモジュールシステムを使ってるみたいな方法で解決するのが正しいような気がした。第 6回 OCamlの「モジュール・システム」 - 数理科学…

... is a rigid type variable bound by ...

なんでこれがエラーになるのかわからないのは、まだなにか理解出来ていことがあるってことなんだろうな。 class Foo a where foobar :: (Bar b) => a -> b class Bar a newtype AFoo = MakeAFoo {foo_value :: Int} newtype ABar = MakeABar {bar_value :: I…

設計設計設計、すこし実装

とりあえずいきなり作ろうとしているゲーム全体の作成に着手したら、細かい実装上の「あれってどうするんだ?」に気をとられて全体の設計が疎かになると思ったのでゲームは3目並べにした。ゲームがなんであっても再利用できるようなライブラリが作りたいわけ…

モナド復習中

main = do x <- rollDice print x から main = do rollDice >>= print からdoを取り除く main = rollDice >>= print 簡単簡単。 http://www.sampou.org/haskell/report-revised-j/exps.html#sect3.14

遅延評価のリストを作る

データ構築子はただの関数じゃないのか? Haskell のリストが分からない。遅延評価も分からない。 - IT戦記 http://d.hatena.ne.jp/amachang/20080201/1201881246 いや、関数なのは別に構わないのだけど、リストを返す関数にしてしまってはいけないと思う。…

リストを作る

amachangと a> 「[]」も「:」も型構築子なんだよ! n> な、なんだってー! という会話をしたので自分メモ。amchangのエントリーにトラックバックするつもりだったのにamachangは書き上げないまま晩ご飯を食べに行ってしまった(><)下のコードは全部同じ結果…

derivingに関する考察

x::Int x = 1 data DerivingShow = Foo Int deriving Show y::DerivingShow y = Foo 2 data CustomizedShow = Bar Int instance Show CustomizedShow where show (Bar x) = "[Custom: " ++ show x ++ "]" z::CustomizedShow z = Bar 2 main = print z これを…