2016-03-12 89 views
0

我新的Haskell和我使用LLVM-一般URE-3.5.1.0庫:Haskell的圖案匹配

https://hackage.haskell.org/package/llvm-general-pure-3.5.1.0/docs/

有一個基本塊的數據類型,命名和名稱數據類型:

data BasicBlock = BasicBlock Name [Named Instruction] (Named Terminator) 
    deriving (Eq, Read, Show, Typeable, Data) 

data Named a 
    = Name := a 
    | Do a 

data Name 
    = Name String --^a string name 
    | UnName Word --^a number for a nameless thing 

我遇到的問題是模式匹配與命名指令。

我的代碼如下所示:

executeInstruction :: Named Instruction -> Memory -> Memory 
executeInstruction inst mem = 
    case inst of 
    Add nsw nuw op0 op1 meta -> undefined 

這給了我,我期待一個錯誤消息,我的類型不匹配命名指令VS指令的。

所以我想剝離命名,只留下一條指令。

stripN :: Named Instruction -> Instruction 
stripN (Name n inst) = inst 

這給出了這樣的錯誤:

構造'名稱」應該有一個參數,但是已經給定2 在模式:名稱爲N研究所

我理解錯誤。但是我不明白如何從命名指令中得到一條指令。

感謝,

回答

2

嘗試是這樣的:

executeInstruction :: Named Instruction -> Memory -> Memory 
executeInstruction (name := inst) mem = 
    undefined 
executeInstruction (Do inst) mem = 
    undefined 

以上,inst :: Instruction,所以你也可以在該模式匹配。

如果你打算做同樣的事情在兩個分支,你可能要定義投影,第一:

getInst :: Named Instruction -> Instruction 
getInst (_ := i) = i 
getInst (Do i) = i 

executeInstruction :: Named Instruction -> Memory -> Memory 
executeInstruction namedInst mem = case getInst namedInst of 
    Add nsw nuw op0 op1 meta -> undefined 
    ... 
+0

謝謝,固定它。 – user2297034

+0

一個簡單的問題是:什麼是:=運算符? – user2297034

+0

@ user2297034我其實不知道,我只是在你的問題中發現它:'data命名爲a = Name:= a |做一個'。所以,':='是'Named'的構造函數之一。我想'命名指令'只是一個普通的insn('Do insn')或者一個帶名稱的標籤('name:= insn')。我不知道這是如何在圖書館中使用的。 – chi