「48時間でSchemeを書こう/評価: 第二部」の版間の差分

削除された内容 追加された内容
M編集の要約なし
200 行
明らかな方法は、unpack関数をリストに格納して<code>mapM</code>を使ってそれらを順に実行するというものですが、残念ながら、これは上手くいきません。なぜなら、標準ではHaskellはリストは''同じ型の''ものしか含むことができないからです。色々なunpack関数は違った型の値を返すので、同じリストにしまうことはできません。
 
ここでは型クラスによって制約される異型リスト(heterogeneous list)を作るために存在型というGHCの拡張を使うことでこの問題を回避します。Haskellでは言語拡張はとてもありふれたことです。言語拡張はそれなりに大きなプログラムを書くときには事実上必須で、しばしば異なる実装間で互換性があります(存在型はHugsとGHCの両方で動き、標準化の候補です)。この拡張を使うために特別なフラグをコンパイラに渡す必要があることに注意してください。後述してあるように -fglasgow-exts を付けるか、より新しい、 -XExistentialQuantification を付けるか、あるいは {-# LANGUAGE ExistentialQuantification #-} というプラグマをファイルの先頭に付けるかのどれかをする必要があります。一般に -Xfoo というコンパイラのフラグをつけることと {-# LANGUAGE foo #-} というプラグマをソースコード中に入れることは等価です
 
最初にやらなければならないのは、<code>LispVal -> 何か</code>という関数において、その「何か」が同値性をサポートしていればどんなものでも保持することのできる型を定義することです。