2016-03-12 69 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