代替案ごとにコンストラクタ名を追加する必要があります。
data NumPair = Pair (Int, Int) | More (Int, NumPair) deriving (Eq, Show)
これらのコンストラクター名は、次のようにデータ型のパターン マッチを可能にするものです。
f :: NumPair -> A
f (Pair (x, y )) = ...
f (More (x, np)) = ...
次に、コンストラクターを使用して値を作成できます (これがコンストラクターと呼ばれる理由です)。
myNumPair :: NumPair
myNumPair = More (1, More (2, Pair (3, 4)))
タイプを改善するには、他に 2 つの方法があります。Haskell コンストラクターには複数のフィールドに対するサポートが組み込まれているため、タプルを使用するのではなく、次のようにコンストラクターで値を直接リストすることができます。
data NumPair = Pair Int Int | More Int NumPair deriving (Eq, Show)
それを改善するもう 1 つの方法は、空でないリストの型を記述したことを認識することです。空でないリストの最適な実装は、Data.List.NonEmpty
ここで見つけるsemigroups
ことができるパッケージにあります。
次に、あなたのタイプは次のようになります。
type NumPair = NonEmpty Int
...そして、そのモジュールから無料で空でないリストの関数の束を取得します。
編集:nmは、あなたがおそらく望んでいたのは次のことであることに気づきました:
data NumPair = Pair (Int, Int) | More ((Int, Int), NumPair)
...これは次と同等です:
type NumPair = NonEmpty (Int, Int)
違いは、この後者では整数のペアを追加できることですが、質問のタイプに従った前のものでは整数のみを追加できます。