2013-04-23 4 views
0

У меня есть эти 2 списка [@,a,@,b,c,@,@,@,(de),@,@,@,f,g,@,h] и ["","","+","","","?","|","","","","","*","","","|",""], и я хочу, используя функцию scanl or map для покрытия второго списка, а также для извлечения элемента перед ним в первом списке. У 2 списков есть разные типы элементов.Указатель элемента в haskell

Например, я хочу, если элемент во втором списке /= "" затем извлечь элемент за ним в первом списке (например, для + для получения a, для ? -> c, *->(de)|->g).

Я пытался что-то вроде этого

map(\x-> if x /= "" then l2 !! (((elemIndices x l1)!!0)-1) else Epsilon)l1 

где l1 is ["","","+","","","?","|","","","","","*","","","|",""] и l2 is [@,a,@,b,c,@,@,@,(de),@,@,@,f,g,@,h] но does't работы, а также @ = Epsilon и от data Reg = Epsilon | Literal Char | Or Reg Reg | Then Reg Reg | Star Reg deriving Eq.

Может кто-нибудь мне помочь?

+0

добавить один (не используются) значения для начала первого списка, а затем использовать zipWith – Arjan

+0

Что вы хотите произойдет, когда элемент из второго списка «?»? Что вы хотите, когда первый элемент второго списка не является '' ''? Каким должен быть результат, когда вводятся два списка, которые вы даете? (Я предполагаю, что это список, но покажите нам список.) – dave4420

+3

P.S. Ваш первый список не является допустимым списком Haskell. Нам легче помочь вам, если вы не внесете расширения в Haskell. – dave4420

ответ

0

Я думаю, что вы хотите что-то вроде

combinedList = zip secondList (Epsilon : firstList) 

А потом посмотреть на "?" вы просто сделаете lookup "?" combinedList и получите Just (Literal 'c').

(Вы можете очевидно попытаться схватить индекс, но это кажется немного окольным для случая, описанного здесь.)

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