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

_ 飲み会。

みんな元気がなかった。でも日本酒とワインは美味しかったので、週明けの健康診断のことを忘れて飲んでしまった。

_ 折り返し

目が覚めたら石切についたところで、折り返しの電車が来てたので走って乗ったら東花園まで行けた。歩くのが一駅分だけになり幸運を感じた。