1

列の行と行の列を表すために使用しているデータ型があります。

data Object a = Row a
                |Column a

data Row a = Object a
             | Left(Row a)(Row a)

data Column a = Object a
             | Above(Column a)(Column a)


testfunction::Object a->String
testfunction Row(Left(c)(d)) = "Recognized row"

Object データ型定義のコンストラクターが他の場所で定義されているコンストラクターを「含む」可能性があり、Object データ型定義の別のコンストラクターが別のコンストラクターのセットを「含む」可能性があることをどのように述べることができるか知りたいです。

そう:

data Object a = Object1(Set1 a)
                | Object2(Set2 a)

data Set1 a = A a| B a| C a| D a
data Set2 a = X a| Y a| Z a

したがって、有効な組み合わせは、Object1(A a) Object1(B a) Object1(C a) Object1(D a)、Object2(X a)、Object2(Y a)、および Object2(Z a) のみです。

4

1 に答える 1

2

あなたのObject aタイプはすべてのタイプで機能しますa。したがって、Object a(関数で行うように)の値を持っている場合、 が何であるかについて何a知りません。特に、それが type の値であることを知りませRow a!

Rowtype と type のコンストラクターとして 2 回指定しているため、これは少し混乱しますObject。この2つはまったく関係ありません。つまり、

data Object a = Row a

Row atype の値を強制的に含めることは何もありませんRow

最も簡単な修正 - おそらくあなたが実際に書くつもりだったもの - は次のとおりです。

data Object a = Row (Row a)
              | Column (Column a)

Rowとが 2 回表示されているため、これは少し混乱しますColumnが、毎回異なることを意味します。次のように書くとより明確になります。

data Object a = ObjRow (Row a)
              | ObjColumn (Column a)

(これらの特定の名前は、私がそれらを何と呼ぶか​​を考えることができなかったのであまり良いものではありませんが、うまくいけば、それらは区別を明確にします.)

このように定義するObjectと、思い通りにパターンマッチできるはずです。

于 2012-09-09T20:22:07.217 に答える