だから、私は文脈上の意味で楽しい実験に取り組んでいて、壁にぶつかっています。あるコンストラクターから別のコンストラクターに変換されるプリミティブまたは関数のいずれかになるデータ型を定義しようとしています。
data WeaponPart =
WInt Int |
WHash (Map.Map String Int) |
WNull |
WTrans (WeaponPart -> WeaponPart)
instance Show WeaponPart where
show (WInt x) = "WInt " ++ (show x)
show (WHash x) = "WHash " ++ (show x)
show (WTrans _) = "WTrans"
show WNull = "WNull"
cold :: WeaponPart -> WeaponPart
cold (WInt x) = WHash (Map.singleton "frost" x)
cold (WHash x) = WHash $ Map.insertWith (+) "frost" 5 x
cold (WTrans x) = cold $ x (WInt 5)
cold (WNull) = cold $ (WInt 5)
ofTheAbyss :: WeaponPart -> WeaponPart
ofTheAbyss (WTrans x) = x (WTrans x)
問題は、署名がofTheAbyss
引数として WeaponPart を許可しているのに対し、私は WTrans で構築された引数のみを許可したいということです。その場合のパターン マッチしか書いていないことがわかります。
GADT を試してみましたが、うさぎの穴だったのではないかと思います。私がやりたいことを彼らにやらせることは決してできませんでした。WTrans引数のみをofTheAbyssに強制する方法を知っている人はいますか? それとも、何かが完全に欠けているだけですか。
ありがとう。
ベスト、エリック