我是Haskell的新手,我正在使用llvm-general-ure-3.5.1.0库:
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
这给了我一个我期望的错误信息,我的类型与命名指令和指令不匹配。
所以我想剥掉名字,只留下一条指令。
stripN :: Named Instruction -> Instruction
stripN (Name n inst) = inst
这会出现此错误:
构造函数`名称'应该有1个参数,但已经给出2 在模式中:名称n inst
我理解错误。但我不知道如何从命名指令中获得指令。
谢谢,
答案 0 :(得分: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
...