0

私はこれらの2つのリストを持っており[@,a,@,b,c,@,@,@,(de),@,@,@,f,g,@,h]、関数を["","","+","","","?","|","","","","","*","","","|",""]使用しscanl or mapて2番目のリストをカバーし、最初のリストでその前にある要素を抽出したいと考えています。2 つのリストには、異なるタイプの要素があります。

たとえば、2 番目のリスト/= ""の要素が、最初のリストでその背後にある要素を抽出する場合 (たとえば、 for+を取得するためa、 for を取得する? -> 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です。

誰かが私を助けることができますか?

4

1 に答える 1

0

あなたは次のようなものが欲しいと思います

combinedList = zip secondList (Epsilon : firstList)

そして「?」と検索する。あなたはただやるだけlookup "?" combinedListですJust (Literal 'c')

(もちろん、インデックスを取得しようとすることもできますが、ここで説明するケースでは少し遠回しに思えます。)

于 2013-04-23T21:00:44.137 に答える