LLVM通用纯库中的Haskell模式匹配

时间:2016-03-12 22:46:49

标签: haskell pattern-matching

我是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

我理解错误。但我不知道如何从命名指令中获得指令。

谢谢,

1 个答案:

答案 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
   ...