我有一個函式宣告:
iexec :: Instr -> Config -> Config
iexec (LOADI x) (counter, memory, stack) = (counter 1, memory, x:stack)
Instr 和 Config 是新的型別類。我希望它像這樣作業:
>iexec (LOADI 5) (0, empty, [])
>(1, fromList [], [5])
我的問題是我不知道如何回傳記憶體的 fromList,其他一切正常。我試著做
iexec (LOADI x) (counter, memory, stack) = (counter 1, Map.fromList memory, x:stack)
但是我收到一個錯誤,該錯誤因輸入而異,但基本上歸結為我不知道此功能的正確語法,或者我無法訪問函式內的 fromList。任何為我指明正確方向的東西都會有所幫助,謝謝。
編輯:根據要求:
type Config = (Int, [Val] ,[Val])
哪里Val是Int. 只使用記憶體時的錯誤資訊是:
error:
? Variable not in scope: empty :: [Val]
? Perhaps you meant ‘mempty’ (imported from Prelude)
|
9 | main = print (iexec (LOADI 5) (0, empty, []))
uj5u.com熱心網友回復:
如果你寫了一個型別簽名,說你回傳一個串列,那么你不能回傳一個映射。所以標題中問題的答案是“不,你不能那樣做。”。
替代計劃有多種選擇。一種是引數化你的Config型別。假設您已將您最喜歡的地圖實作模塊匯入為M,則如下所示:
type Config2 f = (Int, f Val, [Val])
iexec2 :: Instr -> Config2 [] -> Config2 (M.Map Int)
iexec2 (LOADI x) (counter, memory, stack) = (counter 1, M.fromList (zip [0..] memory), x:stack)
main = print (iexec2 (LOADI 5) (0, [], []))
另一種選擇是將您的Config型別更改為始終是地圖:
type Config3 = (Int, M.Map Int Val, [Val])
iexec3 :: Instr -> Config3 -> Config3
iexec3 (LOADI x) (counter, memory, stack) = (counter 1, memory, x:stack)
main = print (iexec3 (LOADI 5) (0, M.empty, []))
還有更多的選擇,但我認為這兩個是最干凈的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/351372.html
標籤:哈斯克尔
上一篇:確定第一個引數的串列是否包含第二個引數的串列中的元素
下一篇:型別同義詞實體
