Haskell

IO モナドは難しい

ふつける p.108 に遅延評価の説明として myIf :: Bool -> a -> a -> a myIf True t e = t myIf False t e = e このように、if を関数で書いてみました。次のプログラムを使って動作を試しましょう。 main = do myIf (True) (putStrLn "then") (putStrLn "els…

正格性フラグ

import qualified Control.Exception as CE data Foo = Foo !Int -- 正格性フラグあり data Bar = Bar Int main = do "Foo" `test` case Foo (3 `div` 0) of Foo _ -> "ok" "Bar" `test` case Bar (3 `div` 0) of Bar _ -> "ok" "Foo2" `test` case Foo (3 `…

hasktags

Haskell 用のタグファイルを作ってくれる hasktags なるものが GHC についてるので試してみる。-R オプションが無いのがちょっと不便。vim でジャンプしようとすると、 E432: Tags file not sorted: tagsなんじゃこりゃー うう…投げやりな感じでソートするよ…

Parsec

Parsec 便利だなー。楽だ。コンパイル時に -package parsec を忘れると意味不明のエラーが出るから忘れないようにしないと。

ふつける 10,11 章

久々にふつける。入門書を順番に読んでたのが昔の俺なんだよな。今の俺は先に unsafePerformIO なんかを見てしまうから困る。 というわけでふつける 10 章。 階層化ライブラリは面倒だなあ。Data.List て。Text.ParserCombinators.Parsrc はさすがに長い。 …

List.zip7

List.zip7 とか使ってる人いるの? あと Scheme の cddadr とか

unsafePerformIO

unsafePerformIO は型安全でないらしい。 test :: IORef [a] test = unsafePerformIO $ newIORef [] main = do writeIORef test [42] bang <- readIORef test print (bang :: [Char]) は SEGV る。test が多相型になっているため、[Int] を書き込むこともで…

ふつける 8,9 章

ふつける 8 章。 ラムダは \ 。これはちょっとなあ…。短すぎるというか、バックスラッシュは気持ち悪い。fn や fun ぐらいのほうが好きだなあ。でもJavaScript の function は長すぎる。OCaml にも function はあるけど、あれはあんまり使わないからいいんだ…

ふつける 7 章

ふつける 7 章 p.160 Haskell には一行コメントがある。OCaml にも欲しい。Camlp4 使ったらできるんだろうか…。マクロとかプリプロセッサとか使うとエディタの色分けがおかしくなるから嫌なんだよな。逆にエディタがマクロの定義を解釈して色分けしたらいい…

ふつける 6 章

ふつける 6 章 p.128。基本的な値とかリテラルとか。まずは Bool 型。代表的な関数として、not と (&&) と (||) がある。これはどれも同じ名前で OCaml にもある。(&&) や (||) は関数なのに右辺が評価されたりされなかったりしてずるい。(||) と全く同じこ…

遅延評価

ふつけるの 5 章。遅延評価。 遅延評価かあ。慣れてなかったらどう評価されるのかまるでわからない。むしろわからないからいいのかもしれない。それが宣言的に書けるっていうことか。多分違う。 前に Packrat Parsing を Ruby で書いてみたけど、遅延評価を…

ふつける 4 章

ふつけるの 4 章。echo コマンド。 import System main = do args <- getArgs putStrLn $ unwords argsimport は open みたいなものか。getArgs はコマンドライン引数を得るアクション。これがアクションになっているのは面白い。OCaml で書くと open Sys le…

ふつける 2,3 章

ふつけるの p.44 head コマンドから。 main = do cs <- getContents putStr $ firstNLines 10 cs firstNLines n cs = unlines $ take n $ lines cslines 関数で文字列を改行で区切ってリストを作って、take 関数で最初の10要素を取る。そして、unlines 関数…

Hello, World!

Haskell の利点とかインストールはさくっと読み飛ばして p.17 の Hello,World! 。 main = putStrLn "Hello, World!"ghc でコンパイル。うん、ちゃんと動く。OCamlで書くと let _ = print_endline "Hello, World!"だな。 ここで 1 章が終わって 2 章へ。UNIX …

Haskell

Haskell の Parsec が何をやってるのか知りたいので Haskell を勉強。前に買って放置していたふつけるを読むことにする。一週間くらいでざっと読めたらイイナ。