2016-09-11 11 views
1

からのデータコンストラクタのリストを取得します。テスト。動的に私はこのようなデータ型を持っているタイプ

私はData.TypeableData.Dataを見てきましたが、タイプ(ABC)で始まるこれをどうやって行うのかはまだわかりません。

大変助かります。

+0

['Arbitrary'](https://hackage.haskell.org/package/QuickCheck-2.9.1/docs/Test-QuickCheck-Arbitrary.html)は、' Dataに頼らずにあなたが望むことをしています。データ)?それ以外の場合は、コンストラクタに渡す引数は何ですか? – Alec

+0

基本的には、コンストラクタのリストで数値のリストを結合したいと思います。しかし、私は動的にコンストラクタのリストを取得したい。 – kurzweil4

+0

「任意」はこの場合私を助けません。私はランダムにデータを生成することを検討していません。すべてのデータインスタンスの条件をテストしたい。 – kurzweil4

答えて

3

Data.Dataを使用しても問題ない場合は、このユースケースでは機能しますが、Intパラメータのために少しぎこちなくなります。

{-# LANGUAGE ScopedTypeVariables #-} 
import Data.Data 
import Data.Typeable 

allCtors :: forall a. Data a => [Int -> a] 
allCtors = map observeCtor $ dataTypeConstrs $ dataTypeOf (undefined :: a) 
    where 
    observeCtor :: Constr -> Int -> a 
    observeCtor c i = fromJust $ fromConstrM (cast i) c 

λ data ABC = A Int | B Int | C Int deriving (Show, Data, Typeable) 
data ABC = A Int | B Int | C Int 
λ map ($ 2) allCtors :: [ABC] 
[A 2,B 2,C 2] 

あなたがData.Dataを使用したくない場合は、GHC.Genertcs-XDefaultSignatures


FWIWでこれを行うことができるように、あなたがいる場合は、このいずれかに対処する必要はないかもしれませんA、B、Cのタグが自分のタイプだったように、あなたは、単に全体のリストを取得するためにenumFrom minBound :: [ABC]を使用して...

data ABCTagged = ABCTagged ABC Int deriving Show 

data ABC = A | B | C deriving (Show, Eq, Ord, Enum. Bounded) 

... ABCをリファクタリングできます。簡単!これはあなたのためにいかに実現可能か確信しています。

+0

データ型は私の実際のデータ型ではありません。私が達成しようとしていることを表現できる最も単純な例でした。だから、タグ付きの例は私にとってはうまくいかないでしょう。しかし、提案に感謝します。 – kurzweil4

+0

私は自分の理解のためにあなたの答えを一つ一つ破り、この 'fromConstrM(Just 10 :: Maybe Int)ctor'を実行したとき' 'd 'を' Int ' 'd'は、 のコンテキストで予期されるタイプにバインドされた固定タイプの変数です。 forall d。データd =>たぶんd at :52:1 予想タイプ:たぶんd 実際のタイプ:多分Int'この場合、ctorAは実際に有効なAコンストラクタを表示します。show ctorA' - > "A" – kurzweil4

+0

OK、私はそれを部分的に理解しました: 'let c = cast 10 :: forall d。データd =>たぶんd'と 'fromConstrM c ctorA'ですが、私は' Just() 'を得ます – kurzweil4

関連する問題