2016-03-12 2 views
0

Я новичок в Haskell и я использую LLVM-общий-Юр-3.5.1.0 библиотеку:Haskell сопоставления с образцом в LLVM-общей-чистой библиотеке

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 

Это дает эту ошибку:

Конструктор `Name» должен иметь 1 аргумент, но было дано 2 В схеме: Имя п инст

Я понимаю ошибку. Но я не понимаю, как получить только инструкцию от именованной инструкции.

Спасибо,

ответ

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 Named a = Name: = a | Сделайте a'. Итак, ': =' является одним из конструкторов 'Named'. Я предполагаю, что «Именованная инструкция» - это просто insn ('Do insn') или помеченные insns с именем (' name: = insn'). Я не знаю, как это точно используется в библиотеке. – chi

Смежные вопросы