0

次の例は、問題を単純化したものです。私はリスト[Either Foo Bar]と別のリストを持っています[Biz]。アイデアは、最初から空になるまで、各Biz要素を繰り返すことです。その結果、より多くのsがより少なくなります。[Either Foo Bar][Either Foo Bar]BizBarFoo[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、ちょうどチェックされた製品、日)`。以下は、この問題に対する私のさまざまなアプローチの間にある壊れたコードです。UnflaggedDayCalendarDay. At that point, I want to use the newly built list, that has the same number of elements still, and theminus 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回繰り返すことでした。もっと良い方法はありますか?そうでない場合、私が言及した基準に基づいてリストを半分に分割する関数はすでにありますか?手作業でそれを行う方法を理解することはできますが、私は車輪の再発明を試みているのではありません。

4

1 に答える 1

2

の各要素は、左( )タイプから離れて右()タイプ[Biz]にある1つ以上の要素を調整する可能性があると思います。これはただの折り目です:[Either Foo Bar]FooBar

eitherList = [Left (), Left (), Right 5, Right 9, Left ()]
bizList = [4,5,6,7,1]

func eitherlst biz = if (Left ()) `elem` eitherlst
                       then Right biz : delete (Left ()) eitherlst
                       else eitherlst

eitherList' = foldl func eitherList bizList 

上記はテストされていませんが、元の要素とその時点までのすべての要素を考慮した結果、eitherListへの各呼び出し間で更新がどのように渡されるかを確認できます。ご覧のとおり、の実装はこれを便利にするものです。funceitherListBizfunc

于 2011-12-27T22:11:35.883 に答える