2016-05-17 7 views
4

データ型のコンストラクタの場合、引数の型以外の基準に基づいて「オブジェクト」の作成を制限する方法はありますか(適切な用語はわかりません)コンストラクタに?例えばデータ型の構築に関するチェックの実行方法

data UInt = UInt Int --the int must be >= 0 

本当に、私は(すべてのサブリストは、同じ長さを有している)は、矩形多次元リストのデータ型を作成したいです。これにはクラスやその他のテクニックが適していますか?

+3

あなたがしようとしている*愛*紙[「製造データ型」](HTTP: //citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.46.2207)ラルフ・ヒンゼ。最初の2つの文章は、「この論文では、与えられたサイズや構造上の制約を自動的に満たす純粋に機能的なデータ型を設計するための一般的なフレームワークについて記述しています。 –

答えて

7

いいえ、ユーザーがコンストラクタに渡す値を強制する方法はありません。

しかし、コミュニティおよび標準ライブラリでは、スマートコンストラクタを作成するのが一般的です。これらは、Data.MapData.Ratioなどのモジュールで表示されます。簡単に言えば、あなただけのタイプ、コンストラクタ自体をエクスポートしていない、とあなたは引数を獣医関数をエクスポート:

module UInt 
    (UInt 
    , uint 
    ) where 

data UInt = UInt Int 

uint :: Int -> Maybe UInt 
uint x | x >= 0 = Just (UInt x) 
     | otherwise = Nothing 
+0

ありがとう! '(UInt'はコンストラクタ' UInt'ではなくデータ型 'UInt'だけをインポートしますか? –

+2

@ MarkAnastos他のモジュールがインポートできるように、タイプをエクスポートするだけです。UInt(UInt)として指定する必要があります。またはUInt(..)を使用して、特定のコンストラクタまたはすべてのコンストラクタをそれぞれエクスポートします。 – bheklilr

関連する問題