所以,我正在做一个有趣的语境意义实验,但我碰壁了。我正在尝试定义一种数据类型,它可以是原始数据类型,也可以是从一个构造函数转换为另一个构造函数的函数。
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 中?或者我只是完全错过了一些东西。
谢谢。
最好的,埃里克