[haskell]内部文字コード

Haskellの文字列扱いを少し

出力結果

Haskell内部ではUnicodeスカラ値で扱われている。

printはどうやらBasic Latinしか文字を表示することができないようで、後は内部コードをそのまま表示している

putStr(Ln)については内部コードに応じたフォントを表示してくれる。

内部コードとUTF-8との変換はencodeString(内部コード >> UTF-8)とdecodeStringを使う。

フォント表示についてはLANG環境変数が影響する。

UTF-8であることをLANGで設定していないと出力で例外となる

[haskell]ディレクトリのリストを出力する

ディレクトリのリストを出力する。ファイル内容を出力する時と同じ要領で作ることができた。

  • dirsから”.”と”..”を除いたリストに対しmapM_でputStarLnをマップしている

haskell事始め

haskellをはじてみる。まずはファイルを扱えるようになることから。以下のコードでファイルの内容を出力するプログラムができる。

  • getArgsは引数を[String]で返してくれる。'<-‘は結果をargsに束縛する。
  • case args of は条件分岐
  • argsが'[]’空リストなら getContentsアクションの結果をputStrアクションに渡す。
  • それ以外なら、argsの各要素に無名関数(\x -> readFile x >>= putStr)をマップ

参照サイト

設計するということ

Z3 – guide

興味あってZ3のチュートリアルをやってみた。設計や検証に使えるのかを知りたかったので。

関数の定義や取りうる値の範囲を決めるところなど、なんとなくソフトウェア設計そのものをやっているみたいだ。しかも、設計をしながら検証を同時におこなえる。

設計の検証をいつでもおこなえるというのはとても良いことではないだろうか。

副作用と参照透過性

副作用

副作用とは「ある機能がコンピュータの(論理的な)状態を変化させ、それ以降で得られる結果に影響を与えることをいう。」とある。要件は以下である。

  • 副作用を受ける処理には、暗黙に参照している変数がある
  • 副作用を与える処理には、暗黙に代入している変数がある

暗黙に値を参照する処理の出力は想定外のものになる。そのため機能は意図していない結果を出力する。

参照透過性

参照透過性とは「式の値はその構成要素(例えば変数や関数)によってのみ定まるということを言う。具体的には変数の値は最初に定義した値と常に同じであり、関数は同じ変数を引数として与えられれば同じ値を返すということになる。とある。要件は以下である。

  • 同じ条件を与えれば必ず同じ結果が得られる
  • 他のいかなる機能の結果にも影響を与えない

参照透過性のある処理の出力は想定内となる。そのため機能は意図した結果を出力する。

機能に欠陥が無いことは入力に対し、意図した出力となっている事で確認できる。つまり、副作用がある構造となっているものはその確認ができない。であるが、実際には暗黙に参照している変数も処理に必要なものである。つまり暗黙に参照している変数も想定内として意図した出力となることを確認すればよい。

しかしながら、暗黙に参照している変数を想定内にしていくことは容易ではない。グローバル、モジュール変数は共有のしやすさから大変便利であり、利用しているソフトウェアは多い。これらは暗黙となり易く、機能追加により肥大化しやすい。

参照透過性を制約として導入している言語は多数あるが、保守すべきソフトウェアはそうでない場合が多いだろう。だから暗黙とならない様に工夫をしていく必要がある。例えばグローバル、モジュール変数は直接参照せず関数の戻り値として受け取る。これにより関数の差し替えを行うことで意図した入出力が行えているか確認することができる。

参考文献

エスケープシーケンス2

先日のエスケープシーケンスBNFを修正。
これでうまいこと字句解析できそうだ。

エスケープシーケンス

エスケープシーケンスを文法として表すにはどうしたら良いのだろう。

terminal-stringを以下の様に定義する。

terminal-string = first-quote-symbol terminal-character+ first-quote-symbol;

terminal-characterとfirst-quote-symbolに「’」を用いる。

terminal-character = ‘;

first-quote-symbol = ‘;

すると、シングルクォーテーションを含む文字列は以下のようになる。

include-single-quotation =  ”’;

これは文法として合っているが、機械処理は難しいことになる。

したがって、エスケープさせたい。

include-single-quotation = ‘\”;

エスケープシーケンスは制御文字のあとに必ずキャラクタが必要であるので、

control-symbol = \;

terminal-string = first-quote-symbol (terminal-character* (control-symbol terminal-character)* terminal-character*)? first-quote-symbol;

となるかな。