что я могу использовать вместо `case of` для уменьшения кода? - PullRequest
0 голосов
/ 08 мая 2018
fmap ( \eachSheet -> case (eachSheet ^. sProperties) of
  Just sheetProperties -> case (sheetProperties ^. sTitle) of
    Just sheets -> (sheetProperties ^. sSheetId)    
    Nothing -> Nothing
  Nothing -> Nothing ) listOfSheets

любой лучший способ для этого сопоставить регистр

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

То, что вы здесь в основном показываете, - это использование Maybe монады , так что мы можем написать это как:

fmap (\s -> (s ^. sProperties) >>= \sheetProperties -> (sheetProperties ^. sTitle) >> (sheetProperties ^. sSheetId)) listOfSheets

Поскольку монада Maybe определяется как:

instance Monad Maybe where
    return = Just
    (>>=) Nothing _ = Nothing
    (>>=) (Just x) f = f x

Или мы можем написать это в нотации do, хотя в основном это то же самое:

fmap f listOfSheets
    where f eachSheet = do
        sheetProperties <- eachSheet ^. sProperties
        sheets <- sheetProperties ^. sTitle
        sheetProperties ^. sSheetId
0 голосов
/ 08 мая 2018

Конкретный паттерн

     case f foo of
       Just bla -> case g bla of
          Just muh -> h muh
       Nothing -> Nothing

характерен для монады Maybe .Этот экземпляр определен как

instance Monad Maybe where
  return = Just
  Nothing >>= _ = Nothing
  Just x >>= f = f x

Таким образом, вы можете переписать приведенную выше конструкцию case в

    f foo >>= \bla -> g bla >>= \muh -> h muh

, которую можно сделать более читабельной, используя синтаксис do

    do
      bla <- f foo
      muh <- g bla
      h muh

или eta-Reduction и оператор композиции Клейсли

     (f >=> g >=> h) foo

В вашем примере последнее фактически невозможно, поскольку самая внутренняя функция не использует sheets но sheetProperties еще раз, но обозначение do все еще можно использовать.

...