【问题标题】:Haskell pattern matching in LLVM-general-pure libraryLLVM-general-pure 库中的 Haskell 模式匹配
【发布时间】:2016-03-12 22:46:49
【问题描述】:

我是 Haskell 的新手,我正在使用 llvm-general-ure-3.5.1.0 库:

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

有一个基本的block数据类型,Named和name数据类型:

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

这给了我一个我期望的错误消息,我的类型与命名指令与指令不匹配。

所以我想去掉 Named 并只剩下一个指令。

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

这给出了这个错误:

构造函数 `Name' 应该有 1 个参数,但已经给出了 2 个参数 在模式中:命名 n inst

我理解错误。但是我看不到如何从命名指令中获取指令。

谢谢,

【问题讨论】:

    标签: haskell pattern-matching


    【解决方案1】:

    试试这样的:

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

    【讨论】:

    • 谢谢,解决了。
    • 一个小问题,:= 运算符是什么?
    • @user2297034 我其实不知道,我只是在你的问题中发现了它:data Named a = Name := a | Do a。所以,:=Named 的构造函数之一。我猜Named Instruction 只是一个普通的insn (Do insn) 或带有名称的标签insn (name := insn)。我不知道这在图书馆中是如何使用的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 2021-05-22
    • 1970-01-01
    • 2017-07-09
    • 2016-04-26
    相关资源
    最近更新 更多