因此,我正在研究一個有趣的實驗,並且我正在碰壁。我試圖定義一個數據類型,它既可以是一個基元,也可以是一個從一個構造函數轉換到另一個構造函數的函數。在簽名中約束構造函數
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-constructred參數。你可以看到我只爲這種情況寫了一個模式匹配。
我試着用GADT做,但我擔心它是一個兔子洞。永遠無法讓他們做我想做的事。有沒有人有任何想法,我怎麼才能強制WTrans的論據進入TheAbyss?還是我完全錯過了一些東西。
謝謝。
貝斯特,埃裏克
這是一個奇妙的答案。我的意思是說我使用GADT的方式是一個兔子洞,但顯然有人明智地可以理解它。而我的光芒,有人呢!精彩。我永遠不會得到如何擁有它,即有武器部分化合物和一些武器部分。此外,這是嵌入式系統節省時間的一個很好的例子。 –
最後一件事,我得到了它的工作,這對我來說是非常激動人心的。我唯一需要改變的是我不得不取出PolyKinds部分並使'data Sort = Base |化合物「轉換爲」數據庫「和」數據化合物「。它一直抱怨說,Base不是一個類型構造函數。有沒有什麼我與PolyKinds失蹤?最有可能的。 –
啊,我會爲其他人留下我的錯誤:我需要DataKinds編譯指示,而不是PolyKinds編譯指示。所有這些奇特的新擴展。 –