Size: a a a

2020 July 26

AA

A64m AL256m qn<co... in Haskell
он и для
lst :: [a] -> Maybe a
lst (reverse -> x:_) = Just x

говорит что _:_ не проверяется, но хоть для
lst :: [a] -> Maybe a
lst (reverse -> x:_) = Just x
lst (reverse -> [] ) = Nothing

ворнинг не выдает
источник

AA

A64m AL256m qn<co... in Haskell
8.8 еще выдавал
Hask.hs:7:1: warning: [-Wincomplete-patterns]
   Pattern match(es) are non-exhaustive
   In an equation for `lst': Patterns not matched: _
 |
7 | lst (reverse -> x:_) = Just x
 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

но что не матчится даже не пытается угадать
источник

YP

Yuriy Pitomets in Haskell
просто для общего развития: кроме линз, какой нормальный максимально обобщённый (Alternative?) способ фильтровать коллекции? Или линзы самый здравый способ, чтобы не юзать частичтый паттерн-матчинг, как в MonadFail, и не писать бойлерплейт в духе _ -> mempty?
источник

AA

A64m AL256m qn<co... in Haskell
7.10 не мог даже это вот чекнуть, но 8.0 уже мог
not :: Bool -> Bool
not b | False <- b = True
     | True  <- b = False
источник

YP

Yuriy Pitomets in Haskell
хотя вот только заметил, что ^.. собирает конкретно тип [], а не искомый IsList m, например..
источник

AA

A64m AL256m qn<co... in Haskell
Yuriy Pitomets
хотя вот только заметил, что ^.. собирает конкретно тип [], а не искомый IsList m, например..
IsList для перегрузки литералов только
источник

AA

A64m AL256m qn<co... in Haskell
8.10 не может проверить и даже не пытается угадать какие конструкторы тут не сматчены:
sig :: Int -> Int
sig x | GT <- compare x 0 = 1
     | EQ <- compare x 0 = 0
     | LT <- compare x 0 = -1
источник

AA

A64m AL256m qn<co... in Haskell
но может чекнуть
sig' :: Int -> Int
sig' x | LT <- cmp0 x = 1
      | EQ <- cmp0 x = 0
      | GT <- cmp0 x = -1
   where cmp0 = compare 0

(подсказать чего не хватает если ветку закомментить все равно не может)
источник

YP

Yuriy Pitomets in Haskell
A64m AL256m qn I0
IsList для перегрузки литералов только
вобщем что-то такое, наверно
mfilter (has _DataConstructor) myCollection
источник

к

кана in Haskell
Yuriy Pitomets
хотя вот только заметил, что ^.. собирает конкретно тип [], а не искомый IsList m, например..
конечно, ^.. это выбор моноида [a], a ^.. b это то же самое что и a ^. b . to (\x -> [x])

не фильтрация, а список таргетов
источник

к

кана in Haskell
но задача слишком обобщенная, у коллекции нет filter?

xs & id %~ C.filter (has _X)
источник

к

кана in Haskell
ну тут конечно %~ не нужен совсем
источник

YP

Yuriy Pitomets in Haskell
кана
но задача слишком обобщенная, у коллекции нет filter?

xs & id %~ C.filter (has _X)
хотелось на будущее запомнить прием, для произвольной коллекции: hashMap, nonEmpty, etc (в контексте тайпклассов)
источник

к

кана in Haskell
для nonempty сигнатура фильтра уже будет другой, там как раз список нужно вернуть
источник

к

кана in Haskell
так что обобщить можно разве что до чего-то вроде

class Filterable s t | s -> t where
 filter :: (a -> Bool) -> s a -> t a

instance Filterable [] []
instance Filterable NonEmpty []
instance Filterable Maybe Maybe
источник

YP

Yuriy Pitomets in Haskell
и оного нет в base? O_o
источник

к

кана in Haskell
ну судя по тому, что мне ни разу такое обобщение не понадобилось, то скорее всего и не будет
источник

YP

Yuriy Pitomets in Haskell
значит одного меня коробит писать конкретику в языке с адхок-полиморфизмом)
источник

к

кана in Haskell
есть concatMap, который уже обобщен до Foldable, но он тоже вернет список
источник

к

кана in Haskell
да это обобщение уж слишком адхок, чуть ли не костыль
источник