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