我有一個資料型別:
data Instr =
LOADI Val|
LOAD Val|
ADD Val|
STORE Val |
JMP Val|
JMPLESS Val|
JMPGE Val
deriving (Eq, Read, Show)
以及一個函式 iexec ,它接受一個指令和一個配置來執行一個程序并回傳新的配置。
iexec :: Instr -> Config -> Config
其中 Config 定義為:
type Config = (Int, [*], [*])
一個例子是 LOADI,它采用值 Val(一個整數)并將其加載到堆疊中,config 引數提供有關堆疊的資訊。它在 GHCI 中看起來像這樣:
>iexec (LOADI 5) (0, empty, [])
> (1, fromList[], [5])
其中程式計數器增加到 1,并且 5 被添加到堆疊中(我不確定 fromList[] 是什么意思,對此的任何解釋將不勝感激)。我也不確定我的配置型別宣告是否正確。
我將如何完成 iexec 函式以使其作業?任何能指出我正確方向的東西都將不勝感激。謝謝你。
uj5u.com熱心網友回復:
這看起來像是基于Concrete Semantics一書的練習。這種語言出現在第 96 頁。從那里的描述來看,配置看起來像是程式計數器、“記憶體”(即整數索引變數串列)和堆疊的組合。
Haskell 型別:
type Config = (Int, [*], [*])
是“有趣的”,它肯定不是你想要的型別。由于此語言中Val的所有值都是s,因此您需要:
type Config = (Int, [Val], [Val])
它表示配置是一個整數程式計數器,一個記憶體是一個Vals串列,一個堆疊是另一個Vals串列。
該指令LOADI將“立即”值加載到堆疊中,因此其實作是:
iexec (LOADI n) (pc, mem, stk) = (pc 1, mem, n:stk)
也就是說,它撞擊程式計數器,不改變記憶體,并將值壓n入堆疊。
該指令LOAD從記憶體中獲取變數的值并將其壓入堆疊。假設type Val = Int,其實作為:
iexec (LOAD i) (pc, mem, stk) = (pc 1, mem, n:stk)
where n = mem !! i
這是因為相同的LOADI,除了推值查找在記憶體中mem !! i。
希望你能弄清楚剩下的。如果您需要提示,iexec上述書籍的第 97 頁給出了 的 ML 實作。
請注意,您的定義ADD看起來是錯誤的,因為該指令不應該帶引數。它只是將堆疊的頂部兩個值加在一起,大概是將答案放在原始兩個值的位置。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/350115.html
標籤:哈斯克尔
下一篇:Haskell中的廣度優先遍歷
