からのデータコンストラクタのリストを取得します。テスト。動的に私はこのようなデータ型を持っているタイプ
私はData.Typeable
とData.Data
を見てきましたが、タイプ(ABC)で始まるこれをどうやって行うのかはまだわかりません。
大変助かります。
からのデータコンストラクタのリストを取得します。テスト。動的に私はこのようなデータ型を持っているタイプ
私はData.Typeable
とData.Data
を見てきましたが、タイプ(ABC)で始まるこれをどうやって行うのかはまだわかりません。
大変助かります。
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をリファクタリングできます。簡単!これはあなたのためにいかに実現可能か確信しています。
データ型は私の実際のデータ型ではありません。私が達成しようとしていることを表現できる最も単純な例でした。だから、タグ付きの例は私にとってはうまくいかないでしょう。しかし、提案に感謝します。 – kurzweil4
私は自分の理解のためにあなたの答えを一つ一つ破り、この 'fromConstrM(Just 10 :: Maybe Int)ctor'を実行したとき' 'd 'を' Int ' 'd'は、 のコンテキストで予期されるタイプにバインドされた固定タイプの変数です。 forall d。データd =>たぶんd at
OK、私はそれを部分的に理解しました: 'let c = cast 10 :: forall d。データd =>たぶんd'と 'fromConstrM c ctorA'ですが、私は' Just() 'を得ます – kurzweil4
['Arbitrary'](https://hackage.haskell.org/package/QuickCheck-2.9.1/docs/Test-QuickCheck-Arbitrary.html)は、' Dataに頼らずにあなたが望むことをしています。データ)?それ以外の場合は、コンストラクタに渡す引数は何ですか? – Alec
基本的には、コンストラクタのリストで数値のリストを結合したいと思います。しかし、私は動的にコンストラクタのリストを取得したい。 – kurzweil4
「任意」はこの場合私を助けません。私はランダムにデータを生成することを検討していません。すべてのデータインスタンスの条件をテストしたい。 – kurzweil4