SE情報技術研究会’s blog

http://se-info-tech.connpass.com

2016-01-11 『ふつうのHaskellプログラミング』 もくもく読書会(第12章) の振り返り

ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門

ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門

  • 作者: 青木峰郎,山下伸夫
  • 出版社/メーカー: SBクリエイティブ
  • 発売日: 2014/10/05
  • メディア: オンデマンド (ペーパーバック)
  • この商品を含むブログを見る

第12章 Wikiエンジンの開発

今回はまずはサンプルプログラムをコンパイルして動かしてみる。

参照:『ふつうのHaskellプログラミング』サポートページ――LazyLinesの入手とインストール
http://i.loveruby.net/ja/stdhaskell/lazylines.html

  • 本のサンプルは古いHaskellで実装されているので、サンプルコードはそのままでは動かない。
  • WebサーバなどのプログラムはRubyで書かれているがダウンロードファイルにサーバの実行ファイルが用意されているのでRubyのインストールなどは不要

Haskellの古いバージョンから新しいのに変える修正はこちらを参考にしました。

Haskellを始めるにあたって読むべき3冊の本 - セカイノカタチ::Techlog

ここにGitHubに修正したものを置いてあるリンクがあるので、そこのソースと比較して修正すると動きました(GHC 7.10.2)

github.com

修正箇所

  • 現在のHaskellだとPreludeのcatchがなくなっているのでSystem.IO.ErrorのcatchIOErrorに変更する必要がある
  • System.IO.Errorがインポートされていないソースファイルでcatchを使っている個所はimport System.IO.Errorのインポートが必要
  • Database.hsは日時関連が変更されているの修正が必要

Database.hsの日時関連の処理は上記のGitHubのソースを参考に直してみた。

  • インポートに下記を追加
import Data.Time.Clock.POSIX (utcTimeToPOSIXSeconds)
import Data.Time (UTCTime)
  • 日時の型変換(UTCTime -> ClockTime)
mtime path = toCalendarTime =<< getModificationTime path

mtime :: String -> IO CalendarTime
mtime path = toCalendarTime . uToC =<< getModificationTime path

uToC :: UTCTime -> ClockTime
uToC t = TOD ( truncate . utcTimeToPOSIXSeconds $ t) 0

ここではgetModificationTime関数で得た値(UTCTime)を直接toCalendarTime関数に渡さず、ClockTimeに変換して渡している

toCalendarTime :: ClockTime -> IO CalendarTime
getModificationTime :: FilePath -> IO UTCTime

コメント

  • ここら辺の修正方法はどこで見つけたのだろうか?
    → 公式なマイグレーションガイドなどがある?

その他

今回はサンプルを動かすところで時間が来たので、本の名内容は次回に持ち越し。

前もってサンプルを動かせるようにした方が良いかも?