次の例は、問題を単純化したものです。私はリスト[Either Foo Bar]
と別のリストを持っています[Biz]
。アイデアは、最初から空になるまで、各Biz
要素を繰り返すことです。その結果、より多くのsがより少なくなります。[Either Foo Bar]
[Either Foo Bar]
Biz
Bar
Foo
[Either Foo Bar]
[Either Foo Bar]
問題は、の次の要素を使用するときの最初から開始できること[Biz]
です。
それが助けになるなら、私がやろうとしていることの例を投稿することができます。
更新:これが私が使用している実際のタイプですが、それでも無関係な情報であると思われるものを除外しようとしています。重要なことを忘れてしまったら教えてください
[Either UnFlaggedDay CalendarDay]
[(CalFlag,Product, Day)]
data CalFlag = FirstPass | SecondPass | ThirdPass deriving (Enum,Eq,Show)
私がやろうとしているのはDay
、のLeft
値と照合することです[Either UnFlaggedDay CalendarDay]
。一致するものを取得したら、次の変更を除いてまったく同じ新しいリストを作成します。これに加えて、リスト内のUnFlaggedDay
次の2つをs [(CalFlag、Product、Day)] (CalFlag、ちょうどチェックされた製品、日)`。以下は、この問題に対する私のさまざまなアプローチの間にある壊れたコードです。UnflaggedDay
CalendarDay
. At that point, I want to use the newly built list, that has the same number of elements still, and the
minus the
flagReserved :: [Either UnFlaggedDay CalendarDay] -> Handler [Either UnFlaggedDay CalendarDay] flagReserved ((Left (MkUFD day)):rest) = do reserved <- runDB $ selectList [TestQueue ==. Scheduled_Q, TestStatus /<-. [Passed,Failed]] [] case (L.null reserved) of True -> do processedDays <- ((Left $ MkUFD day) :) <$> flagReserved rest return processedDays False -> return $ flagReserved' (map prepList ((Left (MkUFD day)):rest)) (flagProductTuple reserved) flagReserved ((Right (MkCal day)):rest) = do processedDays <- ((Right $ MkCal day):) <$> flagReserved rest return processedDays flagReserved _ = return [] flagReserved' :: [Either (UnFlaggedDay) CalendarDay] -> [(CalFlag,Product,Maybe C.Day)] -> [Either UnFlaggedDay CalendarDay] flagReserved' ((Left (MkUFD day)):restD) ((calFlag,firmware,Just startDate):restF) = case (startDate == day || not (calFlag == FirstPass)) of True | (calFlag == ThirdPass) -> flagReserved' ((Right $ conScheduled day firmware Reserved) : restD) restF | otherwise -> flagReserved (Right $ consScheduled day firmware Reserved) : flagReserved' restD ((succ calFlag, firmware, Just startDate) : restF) False -> (Left (MkUFD day)) : flagReserved' restD ((calFlag, firmware, Just startDate) : restF) flagReserved' ((Right (MkCal (Left (MkAD (dayText,day))))):restD) ((calFlag,firmware,Just startDate):restF) = case (startDate == day || not (calFlag == FirstPass)) of True | (calFlag == ThirdPass) -> (Right $ consScheduled day firmware Reserved) : flagReserved' restD restF | otherwise -> (Right $ consScheduled day firmware Reserved) : flagReserved' restD ((succ calFlag, firmware, Just startDate):restF) False -> (Right (MkCal (Left (MkAD (dayText,day))))) : flagReserved' restD ((calFlag,firmware,Just startDate) : restF) flagReserved' ((Right (MkCal (Right unAvailable))):restD) ((calFlag,firmware,startDate):restF) = (Right $ MkCal $ Right unAvailable) : flagReserved' restD ((calFlag,firmware,startDate) : restF) flagReserved' unprocessed [] = unprocessed flagReserved' [] _ = []
アップデート:
私は自分の考えを理解するためにいくつかのテストコードを作成しました。これが私がこれまでに持っているものです
let reservedDays = [(FirstPass,IM,C.fromGregorian 2012 01 15), (FirstPass,WAF,C.fromGregorian 2012 01 14), (FirstPass,Backup,C.fromGregorian 2012 01 13) ] dummyFunc :: [Either UnFlaggedDay CalendarDay] -> (CalFlag,Product,C.Day) dummyFunc dayList (cFlag,product,day) = if day `elem` dayList then dummyFunc' dayList (cFlag,product,day) else dayList dummyFunc' dayList (cFlag,product,day) = if (cFlag == ThirdPass) then
さて、ここで私は立ち往生しています。次の3つの左の値を右の値に変更できるようにする必要があります。私の意図はdummyFunc'
、最初のLeft
値でリストを分割し、それを削除し、新しいRight
値を追加し、以前に分割されたリストに参加し、さらに2回繰り返すことでした。もっと良い方法はありますか?そうでない場合、私が言及した基準に基づいてリストを半分に分割する関数はすでにありますか?手作業でそれを行う方法を理解することはできますが、私は車輪の再発明を試みているのではありません。