プログラミングHaskell [Haskell]
読了.訳者前書きに「この本の著者であるHutton氏は,本書を世に出すことで,Haskellは難しいというのは間違いであることを示してくれた.」とある通り,非常に分かり易い内容になっている.
Haskellの難所であるIOやMonadの説明は最低限に留め,Haskellでの関数型プログラミングをどう勧めるかを実例を通じて丁寧に説明している.200ページ強の薄い本なのでスラスラ読めるが,読後にはHaskellプログラミングを何となく掴めたような気分になる.
私にとってはこの本はReal World Haskell,すごいHaskellたのしく学ぼうに続く3冊目の本であったが,いまから思うと全く読む順が逆だったと思う.
初学者はまず「プログラミングHaskell」でHaskellプログラミングの概要を掴み,「すごいHaskellたのしく学ぼう」でHaskellの特徴的な機能について学び,最後に「Real World Haskell」で実社会の問題解決にHaskellを適用する際のアプローチについて学ぶべきだった.
今にして思うと遠回りした気がする.
にほんブログ村
Haskellの難所であるIOやMonadの説明は最低限に留め,Haskellでの関数型プログラミングをどう勧めるかを実例を通じて丁寧に説明している.200ページ強の薄い本なのでスラスラ読めるが,読後にはHaskellプログラミングを何となく掴めたような気分になる.
私にとってはこの本はReal World Haskell,すごいHaskellたのしく学ぼうに続く3冊目の本であったが,いまから思うと全く読む順が逆だったと思う.
初学者はまず「プログラミングHaskell」でHaskellプログラミングの概要を掴み,「すごいHaskellたのしく学ぼう」でHaskellの特徴的な機能について学び,最後に「Real World Haskell」で実社会の問題解決にHaskellを適用する際のアプローチについて学ぶべきだった.
今にして思うと遠回りした気がする.
Real World Haskell―実戦で学ぶ関数型言語プログラミング
- 作者: Bryan O'Sullivan
- 出版社/メーカー: オライリージャパン
- 発売日: 2009/10/26
- メディア: 大型本
にほんブログ村
HXT arrow lessons [Haskell]
以前書いたように,ブルベ用のGPSデータを作るのに,RideWithGPSでルートを引いた後,轍で間引いてカシミール3Dに変換する,という手順をとっているのだけど,これが結構面倒くさい.特に轍~カシミール3Dのところは単純作業なのでバッチ処理できるようにしたい.
gpxファイルの中身をみたところ,trkファイルもrteファイルもどちらもシンプルなXMLファイルなので,変換自体は簡単そう.間引きには多少アルゴリズムの要素が入るがそれもそんなに難しくないだろう.
ただ,せっかく作るならばHaskellで作ってみたい.
HaskellでXMLを扱うならば,HXT (Haskell XML Toolkit)を使うのが良さそうである.が,XMLライブラリの常で,対象を汎用的,抽象的に扱おうとするから,自分がやりたいことに対して大げさでとっつきにくい.
...と困っていたところ,最初の一歩としては良いチュートリアルを見つけた.
にほんブログ村
gpxファイルの中身をみたところ,trkファイルもrteファイルもどちらもシンプルなXMLファイルなので,変換自体は簡単そう.間引きには多少アルゴリズムの要素が入るがそれもそんなに難しくないだろう.
ただ,せっかく作るならばHaskellで作ってみたい.
HaskellでXMLを扱うならば,HXT (Haskell XML Toolkit)を使うのが良さそうである.が,XMLライブラリの常で,対象を汎用的,抽象的に扱おうとするから,自分がやりたいことに対して大げさでとっつきにくい.
...と困っていたところ,最初の一歩としては良いチュートリアルを見つけた.
HXT arrow lessonsXML documentを扱う基本的な演算であるArrowについて何となく理解できた.
にほんブログ村
Learn You a Haskell for Great Good! [Haskell]
Haskellを勉強するならばLearn You a Haskell for Great Good!がおすすめ.
私の場合でいうと,最初 Real World Haskellを手にしたんだけど,どうにも読み進められず積ん読状態になってしまっていました.
ところが,Learn You a Haskell for Great Good!を知って読み始めたところ,分かりやすくて面白い!
最初,オリジナルのhtml版を読んでいたんだけど,mobi版を見つけてKindleアプリで読むようにしたら,さらにスムーズに読むことができた.
にほんブログ村
私の場合でいうと,最初 Real World Haskellを手にしたんだけど,どうにも読み進められず積ん読状態になってしまっていました.
ところが,Learn You a Haskell for Great Good!を知って読み始めたところ,分かりやすくて面白い!
最初,オリジナルのhtml版を読んでいたんだけど,mobi版を見つけてKindleアプリで読むようにしたら,さらにスムーズに読むことができた.
タグ:Haskell
にほんブログ村
ghcid [Haskell]
Haskellのbuild環境としてstackを利用するようにした.
stackではbuild環境でのツールのバージョン管理を徹底させるために,環境ごとにコマンドやライブラリをインストールして使用するようになってるのだけど,そのためにstackでのbuildの環境とemacsのflymakeの実行環境が異なるためにerrorの出方が違うようになってしまった.
flymakeの設定を直そうかと調べたところ,最近はghcid -- "GHCi as a daemon", "GHC + a bit of an IDE"というものが使われているらしい.
ndmitchell / ghcid
端末で起動しておくと自動でソースの変更を検知して,buildの実行結果を表示するというもの.IDEというよりbuild daemonみたいだけど,やりたいことはflymakeと同じだし,editor非依存のghcidの方がいいかもしれない.
というわけで使ってみた.
はずなんだけど,emacsでファイルを編集すると以下のように言って止まっちゃう.
emacsの一時ファイルにアクセスしようとしているところで一時ファイルが消えたので困っているのは間違いない.
調べると,#Lib.hsというのはemacsが作成するLockファイルのようで,.emacsで 'create-lockfilesをnilに設定すると作られなくなるらしい.というわけで.emacsで以下のようにして対策.
にほんブログ村
stackではbuild環境でのツールのバージョン管理を徹底させるために,環境ごとにコマンドやライブラリをインストールして使用するようになってるのだけど,そのためにstackでのbuildの環境とemacsのflymakeの実行環境が異なるためにerrorの出方が違うようになってしまった.
flymakeの設定を直そうかと調べたところ,最近はghcid -- "GHCi as a daemon", "GHC + a bit of an IDE"というものが使われているらしい.
ndmitchell / ghcid
端末で起動しておくと自動でソースの変更を検知して,buildの実行結果を表示するというもの.IDEというよりbuild daemonみたいだけど,やりたいことはflymakeと同じだし,editor非依存のghcidの方がいいかもしれない.
というわけで使ってみた.
% stack install ghcidでinstallできて
% ghcid --height 16でbuildが自動実行される.(heightは端末の行数)
はずなんだけど,emacsでファイルを編集すると以下のように言って止まっちゃう.
ghcid: /xx/xx/.#Lib.hs: getFileStatus: does not exist (No such file or directory)
emacsの一時ファイルにアクセスしようとしているところで一時ファイルが消えたので困っているのは間違いない.
調べると,#Lib.hsというのはemacsが作成するLockファイルのようで,.emacsで 'create-lockfilesをnilに設定すると作られなくなるらしい.というわけで.emacsで以下のようにして対策.
(add-hook 'haskell-mode-hook '(lambda () (turn-on-haskell-doc-mode) (turn-on-haskell-indentation) (turn-on-haskell-indent) (font-lock-mode) (setq create-lockfiles)))
タグ:Haskell
にほんブログ村
Haskell QuickCheck [Haskell]
リストxの要素数がn以上の場合にはxの先頭n個の要素の平均を返し、nに満たない場合にはNothingを返す関数mavgを書いた。
で、これをQuickCheckでテストしてみたところはまり中。
n=3, x=[0.0,0.0,5.0e-324]でfailしているとのことだけど、prop_mavgの中で計算するa, bを別途計算し比較するとTrueになる。でもprop_mavg 3 [0.0, 0.0. 5.0-e324]を実行するとやっぱりFalseになる。
たぶん、浮動小数の演算誤差だと思うんだけど。。。。
にほんブログ村
take'::Int -> [a] -> Maybe [a] take' n [] = if n == 0 then Just [] else Nothing take' n (x:xs) = if n == 0 then Just [] else let rest = take' (n-1) xs in rest >>= (\r -> Just (x:r)) mavg::Int -> [Double] -> Maybe Double mavg 0 _ = Nothing mavg n x = let xh = take' n x sumMay = foldM ( fmap . (+) ) 0 in case xh of Nothing -> Nothing Just a -> (sumMay $ sequence $ xh) >>= (\s -> Just(s / fromIntegral(n)))
で、これをQuickCheckでテストしてみたところはまり中。
prop_mavg n x = let a = mavg n x b = ( sum $ take n x ) / fromIntegral(n) in if n > 0 && n <= length(x) then let a' = fromJust a in a' == b else a == Nothing main = do quickCheck prop_mavg let n = 3 x = [0.0, 0.0, 5.0e-324] :: [Double] a = mavg n x b = (sum $ take n x) / fromIntegral(n) :: Double putStrLn $ show(a == Just b) putStrLn $ show(n > 0) putStrLn $ show(n <= length(x)) putStrLn $ show(prop_mavg n x)
*** Failed! Falsifiable (after 29 tests and 1086 shrinks): 3 [0.0,0.0,5.0e-324] True True True Flase
n=3, x=[0.0,0.0,5.0e-324]でfailしているとのことだけど、prop_mavgの中で計算するa, bを別途計算し比較するとTrueになる。でもprop_mavg 3 [0.0, 0.0. 5.0-e324]を実行するとやっぱりFalseになる。
たぶん、浮動小数の演算誤差だと思うんだけど。。。。
にほんブログ村