Антон
Просто у первого варианта наименьшая ментальная нагрузка
Dmitry
Да, это так.
Dmitry
Хотя трудно удержаться...
Антон
Не волнуйся, это не го, тебя не будут пинать за сложные решения :D
Alexander
но это не точно
Alexander
да
Andrey
Сам через месяц свой кот просто не поймешь с первого взгляда, а так никто ругать не будет
Ilya
Dmitry
По мелочи - я бы tail на (drop 1) заменил.
Антон
Cheese
слово "частичная" не отражает всю глубину падения. лучше называть такие функции, например, недоопределёнными
Ilya
Ilya
λ> let x = []
λ> zipWith (+) x (tail x)
[]
IC
Зигохистоморфный
ну раз так
liftA2 (liftA2 (zipWith (+))) pure tailMay
Dmitry
А если надо из следующего вычитать предыдущий? Я не хочу спорить. И сам tail наверное напишу. А потом на drop исправлю :-)
Зигохистоморфный
Ilya
Ilya
про drop 1 вместо tail лучше вообще забудь
Dmitry
а в чем причина, почему это так серьезно?
Dmitry
А что, если не вычитание, а другая некоммутативная операция?
Зигохистоморфный
Ilya
Зигохистоморфный
Alexander
В копилку "на забывание": в разных источниках рекомендуется разное по поводу foldr, foldl и foldl'. Кажется, все из них сходятся, что foldl не стоит использовать, а насчет foldr и foldl' мнения расходятся.
Ilya
бектики
а, просто чужой синтаксис выглядит синим, а свой зеленым
Зигохистоморфный
Зигохистоморфный
Алексей
Ilya
А чем плох drop 1?
это попытка сделать tail "безопасным", пожертвовав инъективностью функции, то есть drop 1 [] == drop 1 [x]
Думаю можно придумать конкретных примеров, где это будет приводить к проблемам, но мне и этого общего соображения достаточно
Алексей
Не думаю, что потеря инъективности является проблемой
Dmitry
tail [x] == tail [y]
Aliester
Ilya
tail [x] == tail [y]
да, не совсем строго выразился. но думаю меня поняли. В любом случае продолжаю считать drop 1 плохой идеей
Влод
ребят, есть линза Lens' a b и есть функция b -> Lens' a c из этого же можно как-то получить Lens' a c ?
Зигохистоморфный
Alexander
Не думаю, что потеря инъективности является проблемой
Согласен. Когда пишешь реальный код на Haskell, вообще не думаешь ни о чем таком. Просто пишешь код с инвариантами, и все.
Большей проблемой, пожалуй, будет манипуляция со списками как таковыми. Потребности дропнуть что-то у меня пока не возникало. Да и вообще, предпочитаю деконструировать или фолдить
Алексей
+ если надо различать [] и [_], то есть паттертматчинг
Зигохистоморфный
Dmitry
Кстати, а что если в zipWith f x (tail x) функция вдруг неленивая?
Alexander
то ничего страшного
Ilya
Dmitry
да, сообразил уже :-)
Dmitry
по делу не прицепиться :-)
Alexander
про drop 1 неочевидно, что выдача [] на пустом списке и на [x] лучше чем выдача исключения на пустом
Alexander
но вообще drop 1 вместо tail - вполне себе хорошая идея
Cheese
Влод
btolac?
Cheese
btolac?
btolac :: b -> Lens' a c
Влод
аа понял нотацию
Cheese
lac :: Lens' a b -> (b -> Lens' a c) -> Lens' a c
lac lab btolac = lens
(\a -> let b = a ^. lab in a ^. btolac b)
(\a c -> let b = a ^. lab in a & btolac b .~ c)
Cheese
но вообще ты хочешь странного
Cheese
я не могу придумать этому адекватное имя
Cheese
подозреваю, что тебе такая линза не нужна на самом деле
Влод
внутри стейта есть поле по которому я выбираю выбираю запись из хешмапа из этого же стейта
Влод
тип звучит странно - ведь вроде бы это поле статично отношсительно хешмапа
Влод
но в стейте в разное время меняются это поле и хешмап
Влод
ох вау
Влод
типы сошлись
Alexander
говори правильно - натянулись
Влод
это кажется невероятным когда скопипастил
Влод
да да
Влод
выелетело слово из головы
Alexander
x !! 0 это не тоже самое
Ilya
попытка рулить списком через индексы
Alexander
т.е. x !! 0 и head x обладают одними свойствами
Alexander
drop 1 и tail разными
Ilya
drop 1 и tail разными
пока не увидел ни одного примера, где это пригодилось бы. пытались натянуть на zipWith, но не вышло.
а многие так могут писать, просто перенося 1-в-1 питоновский стиль, даже не задумываясь о "разных свойствах". я об этом.
Alexander
везде где f [] -> [] нормальное преобразование
Ilya
Ilya
Alexander
ag "drop 1"
libraries/<censored>/src/AS/Json.hs
36:optionsDrop1 = defaultOptions { fieldLabelModifier = drop 1 }