Yoichi's diary
2014-10-12
_ [fpinscala] EXERCISE 4.1
REPLで :load したらエラーになるという状態で詰まっていたが、ふとscalacでコンパイルして import すればいいということに気づいて先に進めた。_ [scala] provide accessible scope in REPL
Scala in Depthの2章のサンプルを眺めていたら答えがあった。object holder {} なりで囲むことで、一度にコンパイルされるようにしてやれば :load でエラーにならない。[ツッコミを入れる]
2014-10-16
_ [Haskell] force all characters from a file to be read
import Data.Char(toUpper) main = do str <- readFile "inout.txt" writeFile "inout.txt" (map toUpper str)は str が評価されてないため、readFile でファイルを開いたまま同じファイルを writeFile で開こうとしてエラーになる:
% runghc toUpper.hs toUpper.hs: inout.txt: openFile: resource busy (file is locked)無理やりエラーを回避するなら
import Data.Char(toUpper) main = do str <- readFile "inout.txt" print str writeFile "inout.txt" (map toUpper str)としてやればいいことはわかったが、もっとすっきりやれないかと思い調べてみたところ、DeepSeq を使って以下のようにすればいけた:
import Control.DeepSeq(deepseq) import Data.Char(toUpper) main = do str <- readFile "inout.txt" str `deepseq` writeFile "inout.txt" (map toUpper str)DeepSeqのソースから関連部分を抜き出すと、
deepseq :: NFData a => a -> b -> b deepseq a b = rnf a `seq` b class NFData a where rnf :: a -> () rnf a = a `seq` () instance NFData Char instance NFData a => NFData [a] where rnf [] = () rnf (x:xs) = rnf x `seq` rnf xsリストの各要素に対して seq を適用することで強制的に評価させている。
[ツッコミを入れる]
2014-10-26
_ 大阪マラソン観戦
妻に誘われて前回に続き家族3人で見に行きました。
全身スイカの人とかスーツ着て片手にカバンの人とか、暑い中そんな格好で走れるのはすごいなぁと思いました。
妻の目的だった小渕さんは1地点目アンパンマンに気をとられて見過ごす、2地点目無事に見れて、3地点目は通り過ぎた後でした。
[ツッコミを入れる]
2014-10-27
_ 夜中の雷雨
雷の光と音が怖いので寝る前にカーテン閉めてたのを、朝暗いと寝坊しそうなので途中目が覚めたときに雷が収まったと思って開けたら、次は激しい雨の音で叩き起こされました。
[ツッコミを入れる]
2014-10-30
_ [math] モンティ・ホール問題
モンティは答えを知っていて、ハズレを開くというのがポイントか。直感的にはまだしっくり来てないけど。
先日本屋さんで蟹江さんの「なぜか惹かれるふしぎな数学」を見つけて即買い。蟹江さんとは高校の先生に連れられて行った美杉合宿で出会い、数学の楽しさを教えてもらったと記憶している。あの頃の好奇心を今でも持てているかなと自問自答しながら、また、ふしぎな数学にわくわくしながら読んでいる。
_ [fpinscala] EXERCISE 5.18 Stream.scanRight
nに対して線形であるべしとあるのだが、Stream を生成するのは線形になっているように見えるものの、toList すると評価された結果が再利用されてない部分が残っているようである。scala> Stream(1,2,3,4).scanRight(0)((a,b) => { | println("x") | a + b | }) x x x x res3: fpinscala.laziness.Stream[Int] = Cons(<function0>,<function0>) scala> res3.toList x x x x x x res4: List[Int] = List(10, 9, 7, 4, 0)標準のStreamだとそんなことはない
scala> Stream(1,2,3,4).scanRight(0)((a,b) => { | println("x") | a + b | }) x x x x res0: scala.collection.immutable.Stream[Int] = Stream(10, ?) scala> res0.toList res1: List[Int] = List(10, 9, 7, 4, 0)何故だ?
[ツッコミを入れる]
2014-10-31
_ 飲み会。
みんな元気がなかった。でも日本酒とワインは美味しかったので、週明けの健康診断のことを忘れて飲んでしまった。
_ 折り返し
目が覚めたら石切についたところで、折り返しの電車が来てたので走って乗ったら東花園まで行けた。歩くのが一駅分だけになり幸運を感じた。
[ツッコミを入れる]