2013-04-23 56 views
0

我有这两个列表[@,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]但它简化版,工作,也@ = Epsilon,它是从data Reg = Epsilon | Literal Char | Or Reg Reg | Then Reg Reg | Star Reg deriving Eq

有人可以帮助我吗?

+0

一个(未使用)值添加到第一列表的开始,然后用zipWith – Arjan 2013-04-23 20:37:26

+0

你想要什么当第二个列表中的元素是''“'时发生?当第二个列表的第一个元素不是'“”'时,你想要发生什么?当你给出的两个清单是输入时,结果应该是什么? (我认为这是一个清单,但向我们显示清单。) – dave4420 2013-04-23 20:42:32

+3

P.S.你的第一个列表不是有效的Haskell列表。如果你不构成对Haskell的扩展,我们会更容易帮助你。 – dave4420 2013-04-23 20:44:05

回答

0

我想你想要像

combinedList = zip secondList (Epsilon : firstList) 

然后查找 “?”你只需要做lookup "?" combinedList并得到Just (Literal 'c')

(你可以明显地试图抓住了指数,但它似乎对这里所描述的情况有点迂回。)

相关问题