2016-05-09 22 views
0

構造体の要素に適用される特定の制約/規則があり、これを型に反映できるように、Haskellでどのようにデータ構造体を定義することが可能でしょうか。例えばHaskellでデータ構造体/型を定義する

私は別のタイプのリストで構成されたタイプを持っている場合、

R = [Xを言います| x < - 入力、ルール1、ルール2、ルール3]。

この場合、rの型は(type of x)の要素のリストです。しかし、これを言って、私たちはルールを失う。だから、この余分な情報を型定義にどのように保持することが可能でしょうか。

私の質問にもっと具体的に言えば、スドコの場合を取る。スドコのグリッドは行のリストであり、順番にセルのリストです。しかし、我々が知っているように、値には制約があります。しかし、タイプを表現するとき、これらの制約はグリッドと行のタイプの定義に現れません。

これは可能ですか?

ありがとうございました。

+0

場合によっては、GADTが役立ちます。従属型はすべてを行うことができますが、Haskellではサポートされていません(プログラマからの些細な努力も必要です)。 – chi

+0

"些細ではない努力が必要" - 正しいプログラムを得るために必要な労力は一定です。選択肢は、宣言するタイプ、書いた実装、頭の中だけで、その努力が現れる場所です。もちろん、最後の変種は最も再利用できません。 – d8d0d65b3f7cf42

答えて

2

sodokuの例では、それぞれが 'rule'またはsemanticプロパティを表す複数のコンストラクタを持つデータ型を作成します。 I.E。

data SodokuType = NotValidatedRow | InvalidRow | ValidRow 

現在、いくつかの検証機能であなたはsodokuルールの検証、およびあなたが成功した行(または列またはなどの正方形)を検出ValidRowを検出InvalidRowを返します。これにより、パターンマッチも可能になります。

問題は、タイプを使用していないということです。値を使用しています。リストには値のリストが定義されていますが、リストには値のリストがありません。

私が使用した例は、行の位置などに関する情報が含まれていないため、あまり有用ではありませんが、自分で定義することができます。

関連する問題