21

私たちが持っているとしましょう

data D = X Int | Y Int Int | Z String

機能が欲しいgetDConst

getDConst :: D -> String

入力に使用されるデータ コンストラクターに応じて、"X"、"Y"、または "Z" のいずれかを返します。caseすべてのデータ コンストラクターで行う必要なく、これを記述する一般的な方法はありますか? (依存するソリューションData.Typeableまたは同様のもので問題ありません)

4

3 に答える 3

23

自分で解決策を見つけましたが、他の人を助けるためにこの質問を残してください:

import Data.Data
data D = X Int | Y Int Int deriving (Data,Typeable)

let result = show $ toConstr (X 3) -- result contains what we wanted
于 2013-08-18T08:50:34.193 に答える
10

を使用したくない場合はTypeable、 でこれを行うこともできますShow

getDConst :: D -> String
getDConst = head . words . show

Show怠惰なので、すべてのフィールドを出力しません。でこのコードを実行してテストできますghci

Prelude> data D = D [Int] deriving (Show)
Prelude> getDConst $ D [1..]
"D"
于 2013-08-18T09:06:40.263 に答える