- 1
- 2
- 3
- 4
- 5
- 6
- 7
if ($count == 1 or $count == 21 or $count == 31 or $count == 41 or $count == 51 or $count == 61 or $count == 71 or $count == 81) ( $str = ' товар');
if ($count == 2 or $count == 3 or $count == 4 or $count == 22 or $count == 23 or $count == 24 or $count == 32 or $count == 33 or $count == 34 or $count == 42 or $count == 43 or $count == 44 or $count == 52 or $count == 53 or $count == 54 or $count == 62 or $count == 63 or $count == 64) ( $str = ' товара');
if ($count == 5 or $count == 6 or $count == 7 or $count == 8 or $count == 9 or $count == 10 or $count == 11 or $count == 12 or $count == 13 or $count == 14 or $count == 15 or $count == 16 or $count == 17 or $count == 18 or $count == 19 or $count == 20 or $count == 25 or $count == 26 or $count == 27 or $count == 28 or $count == 29 or $count == 30 or $count == 35 or $count == 36 or $count == 37 or $count == 38 or $count == 39 or $count == 40 or $count == 45 or $count == 46 or $count == 47 or $count == 48 or $count == 49 or $count == 50 or $count == 55 or $count == 56 or $count == 57 or $count == 58 or $count == 59 or $count == 60 or $count == 65) ( $str = ' товаров');
if ($count > 81){
$str=" тов";
}
Developer 07.11.2017 14:47 # +1
bormand 07.11.2017 18:15 # +2
1024-- 07.11.2017 18:49 # +2
bormand 07.11.2017 19:17 # +2
SemaReal 07.11.2017 19:44 # +1
SemaReal 07.11.2017 21:42 # +1
SemaReal 07.11.2017 21:57 # 0
Такими темпами я все лабы на руби сдам и уйду на летние каникулы с пятеркой
roman-kashitsyn 07.11.2017 22:03 # 0
vistefan 10.11.2017 11:05 # 0
roman-kashitsyn 10.11.2017 12:56 # 0
А где утверждается, что это синтаксически неверно? Синтаксически всё верно, тут ошибка типизации.
Приоритеты операторов значения не имеют, т.к. все операторы записаны в функциональной форме. В этом выражении вызывается функция
(:) :: a -> [a] -> [a]
с 4-мя аргументами:
1 :: Num t => t
(++) :: [a] -> [a] -> [a]
[2, 3] :: Num t => [t]
[4,5,6] :: Num t => [t]
vistefan 10.11.2017 14:09 # 0
В задании на stepik.org. Там говорится: выберите синтаксически верные выражения. Это считается неверным.
roman-kashitsyn 10.11.2017 14:20 # 0
roman-kashitsyn 12.11.2017 20:22 # +1
bormand 13.11.2017 07:07 # 0
roman-kashitsyn 13.11.2017 12:30 # +2
Вторая часть мне кажется гораздо интересней, можешь с неё сразу начать. Там ключевые вещи из Typeclassopedia разбираются. Интереснее всего смотреть чужие решения, чакры раскрываются.
В общем, на твоё усмотрение, курс бесплатный.
vistefan 13.11.2017 09:38 # 0
Определенный интеграл функции на отрезке методом трапеций.
roman-kashitsyn 13.11.2017 12:45 # 0
Возможно, когда a == b, a > b в helper никогда не выполняется.
У тебя слишком много кода, лучше всего написать определение из вики, его точно принимает, и кода мало получается.
vistefan 13.11.2017 17:35 # 0
roman-kashitsyn 13.11.2017 18:00 # 0
при желании можно заменить g на (f . (a +) . (* h)), но это, кмк, менее читабельно.
vistefan 13.11.2017 23:58 # 0
Почему тут ответ 9 и какого именно вида эти функции.
Сколько разных всегда завершающихся функций с типом a -> (a,b) -> a -> (b,a,a) можно реализовать?
Почему функция, которую возвращает carry id имеет тип a -> b -> (a, b). Нигде ничего не смог начитать, карринг же наоборот все тьюплы превращает в последовательность вызовов, какого рожна?
1024-- 14.11.2017 00:25 # 0
> Нигде ничего не смог начитать, карринг же наоборот все тьюплы превращает в последовательность вызовов, какого рожна?
curry работает для функций, которые по смыслу бинарные, а id унарна. Соответственно, тут здравый смысл не работает, а работает только математика со своими упоротыми неинтуитивными выводами.
roman-kashitsyn 14.11.2017 00:54 # 0
Банальная комбинаторика: b в результате можо выбрать только одним способом, два a можно выбрать 3^2 способами (использовать первый аргумент два раза, первый + второй, второй + первый, второй два раза и т.д.)
> Нигде ничего не смог начитать
ghci использовать не пробовал?
:t curry
curry :: ((a, b) -> c) -> a -> b -> c
:t id
id :: t -> t
Первый аргумент curry имеет вид
(a, b) -> c
Давай решим уравнения
t -> t = (a, b) -> c
t = (a, b)
t = c
-----
c = (a, b)
следовательно, тип c = (a, b), а у id в этом контексте должен быть тип
id :: (a, b) -> (a, b)
подставляем c = (a, b) в curry, получаем
curry :: ((a, b) -> (a, b)) -> a -> b -> (a, b)
1024-- 14.11.2017 01:15 # 0
А, то есть смысл всё же есть. Область определения id сужается до кортежа, и по сути она становится некаррированным конструктором кортежа (uncurry (,)) - принимает кортеж и возвращает кортеж. curry делает из этого конструктор кортежа нормального человека (который не требует кортеж для создания кортежа)
И, соответственно, curry id = (,)
1024-- 10.12.2017 03:05 # −1
> > a -> (a,b) -> a -> (b,a,a)
> Банальная комбинаторика: b в результате можо выбрать только одним способом, два a можно выбрать 3^2 способами (использовать первый аргумент два раза, первый + второй, второй + первый, второй два раза и т.д.)
Роман какой-то умный, я месяц назад его ответ так и не понял.
На случай, если кто-то столь же простой умом, сколь и я, будет мимопроходить и читать обсуждение:
1. Первое, что приходит в голову - мы можем написать их бесконечность, т.к. существует бесконечность типов a, b и у них может быть до бесконечности значений.
2. Это неверно, т.к. на самом деле из-за максимально свободного выбора типов (a, b - любое) у нас связаны руки, и мы минимально свободны. Мы должны написать такую функцию, которая подходила бы для любого типа, даже для неба, Аллаха, пустого кортежа и т.п.
3. Т.к. у нас связаны руки, мы не имеем никакой возможности сконструировать значение (нет универсального конструктора значения для любого типа), и единственное, что мы можем сделать - возвратить уже имеющееся значение.
4. a -> a - одна функция, т.к. передают одно значение и вернуть можем только его
(a, a) -> a - две функции, т.к. передают два значение и вернуть можем либо одно, либо другое
a -> a -> a, (a, a) -> a, a -> b -> a -> a, (a, b) -> a -> a, (a, b, a) -> a - снова две функции, т.к. на входе два значения типа a, а на выходе - одно, и не важно, во сколько этапов их передавали и как зашумляли ввод другими типами
5. (a, a, a) -> (a, a) - 9 вариантов, т.к. возвращаем два a, и каждое из них можно выбрать из трёх вариантов (то, о чём говорил Роман).
a -> b -> (c, a) -> a -> d -> (a, a, b) - снова 9 вариантов, т.к. на входе каким-то способом передали те же 3a, а вернуть надо 2a.
SemaReal 10.11.2017 18:22 # 0
vistefan 13.11.2017 09:40 # +2
HACTEHbKA 13.11.2017 14:16 # +2
vistefan 13.11.2017 14:23 # 0
HACTEHbKA 13.11.2017 14:42 # 0
subaru 13.11.2017 15:29 # 0
TOMAT 13.11.2017 15:39 # 0
roman-kashitsyn 13.11.2017 15:56 # 0
А почему тогда у тебя "Синьор Помидор" на аватарке?
TOMAT 13.11.2017 15:58 # 0
1024-- 13.11.2017 16:05 # +2
SemaReal 14.11.2017 00:16 # 0
Как выходишь ты к базару,
Так за ним видать собор,
Я пришел сюда сегодня,
Чтоб нажраться помидор.
На весах – мордатый дядя,
Груда ящиков за ним,
Подмигнул ему я хитро:
Выдвигай, мол, всё съедим!
Ну а он мне прямо в рыло
Волосатый свой кулак:
Ты уматывай отселе,
Быстро чтобы и вот так!
Не с твоим свинячьим рылом
Вкусный кушать помидор.
Я в грустях ушел с базара,
С коего видать собор.
И сказать по-правде нужно:
Братцы, грубь-то нам зачем?
И на кой руками в рыло?
Помидор охотно всем.
Помидорчиков захотелось?
Помидор охотно всем.
roman-kashitsyn 07.11.2017 22:00 # +1
SemaReal 07.11.2017 22:04 # +1
На самом деле в каждом языке есть свой подход к таким вот "on demand рекордам (структурам?)".
Котлин предлагает data classes. Руби предлагает Struct или OpenStruct (у последней равенство проверяется по всем полям, по утячьи) в питоне изначально это были туплы.
Очень много методов в API которые возвращают кортежи типа (день, месяц, год).
И только в джаве нифига нет кроме громоздкого класса с полями, конструктором и геттерами.
Даже си умеет структуры
roman-kashitsyn 07.11.2017 22:05 # 0
SemaReal 07.11.2017 22:08 # 0
https://docs.microsoft.com/ru-ru/dotnet/csharp/language-reference/keywords/struct
https://kotlinlang.org/docs/reference/data-classes.html
А правда D юзают в facebook и ebay?
roman-kashitsyn 07.11.2017 22:13 # 0
netflix тоже
MediumGovno 01.08.2021 10:49 # 0
subaru 07.11.2017 22:16 # +1
SemaReal 07.11.2017 22:18 # 0
subaru 07.11.2017 22:22 # 0
roman-kashitsyn 07.11.2017 22:22 # 0
In all likelihood we'll follow up with a blog post describing the process.
Andrei
-- http://forum.dlang.org/post/[email protected]
Возможно, он имеет ввиду вот эту поделку
subaru 07.11.2017 22:09 # +1
очко сжимается от мысли о том, как это все сломается при изменении полей.
SemaReal 07.11.2017 22:11 # +2
Хотя учитывая иммутабельность строк и наличие пула строковых литералов вполне могли бы дикты (как в javascript)
но более всего я бешусь когда кортежи юзают как рид-онли листы. вбивав би!
1024-- 08.11.2017 04:16 # +1
+1
Хотя, это вина создателя языка, что он либо назвал список кортежем, либо дал кортежу интерфейс списка.
Если сравнивать использование списка и использование неизменяемого списка, то второе в общем случае лучше, т.к. меньше шансов выстрелить себе в ногу при смешивании передачи по ссылке и мутабельности.
А вообще, подобная питушня свойственна утиной типизации:
P.S. Какие базисные векторы типизации у нас есть? строгость, статичность-динамичность, явность, утиность, что-нибудь ещё?
Кажется, что утиность не является линейной комбинацией строгости, -ичности и явности:
SemaReal 08.11.2017 04:29 # 0
На самом деле не совсем так.
В питоне роль "интерфейсов" часто играют протоколы: нужно просто реализовать метод foo чтобы стать "foo-like объектом". В какой-то момент это всех заебало и появились Abstract Base Classes (ака ABC), но это уже другая сказка.
Собственно, в этом и есть смысл утки: не нужно явно наследовать какой-то интерфейс, городить адаптеры итд, достаточно реализовать нужный метод и правильно его назвать.
Чтобы быть "Iterable" надо иметь метод ``__iter__`` который вернет iterator, и тогда по тебе можно делать "for spam in ТЫ", можно делать тебе next() итд.
Ну вот list (мутабельный список) и tuple (кортеж) успешно этот "контракт" реализуют. Не понимаю нафига это делает тупл: К кортежу надо по индексу обращаться, за желание итерироваться по картежу надо бы пиздить наверное.
Достаточно было реализовать __get__, imho.
В какой-то момент чуваки поняли что тупл это такая славная защита для всякого рода констант и дефалтных значений аргументов чтобы никто их не поменял, и понеслась.
1024-- 08.11.2017 04:59 # 0
> На самом деле не совсем так.
Я здесь использую слово "интерфейс" в более общем смысле.
Чтобы было "так", исправлю "интерфейс списка" на "интерфейс массива", т.к. ожидаемый интерфейс списка - это next(node) и isnull(node), а не element(list, index) и length(list), что является интерфейсом массива.
Кстати да. То, что списку дан интерфейс массива (или массив назван списком) - тоже странно.
https://wiki.python.org/moin/TimeComplexity
Похоже, либо я не умею в О-нотацию, либо перед нами массив.
> Достаточно было реализовать __get__, imho.
Действительно. Смотрелось бы более близко к привычным людям кортежам.
Впрочем, доступ по индексу на практике удобнее. Более полезно было бы переименовать существующие list, tuple и array в array, const_array и fast_array, чтобы не путать людей. А кортежи в интерпретируемой динамической питушне с массивами и словарями вроде как и не нужны.
bormand 08.11.2017 08:25 # +3
SemaReal 09.11.2017 02:45 # 0
Я думаю что список это такой тип, по которому можно итерироваться и обращаться по индексу. А как он там внутри сделан (через linked list или array) это уже детали.
Тащемто в жабе так и есть: interface List раследуют ArrayList и LinkedList (и еще пяток-другой всяких других).
O(1) у массива ровно потому, что в x86 (и других современных процах) можно сделать
mov eax, [началоМассива + индексМассива]
Это куда как более низкоуровневые детали, чем понятие список
inkanus-gray 13.11.2017 16:08 # +1
P.S. Для полноты картины осталось найти ещё десять языков.
roman-kashitsyn 13.11.2017 16:57 # +3
Кто такие полиморфные питухи в Хаски и почему они утиные?
P.S.
Самец утки называется се́лезень, а не питух.
A male duck is called a drake.
1024-- 13.11.2017 22:10 # 0
Например, f в следующих определениях:
f требует, чтобы xs было списком чего-то, а duck преобразовывала бы это конкретное что-то куда-то во что угодно. Соответственно, f работает для списков многих типов и с разными (с точки зрения типов) реализациями duck. (И с разными реализациями map)
Аналогично, если бы f x y было бы просто x + y, f бы работала для любых типов, над которыми бы определили сложение. Не просто для какого-то там общего Num, а для всего, лишь бы + как-то определили.
roman-kashitsyn 13.11.2017 22:23 # +3
> f x y было бы просто x + y, f бы работала для любых типов, над которыми бы определили сложение
Нет, f будет требовать тайпкласс, который определяет +. "Утиная" типизация локальна, она вычисляет минимальные требования исходя из использования. Хаски, конечно, выведет наиболее общий тип, но не с точностью до конкретных операций.
Толи дело OCaml.
1024-- 13.11.2017 23:26 # 0
А именно: вопрос философский, выводы зависят от способа подгона к нему теории; либо требуется количественное измерение характеристики, а не просто "да"/"нет".
Как со строгостью Python/Java, где =/+ нестрогие и со слабостью JS, где точка строгая.
> но не с точностью до конкретных операций.
Для стороннего наблюдателя различие с истинно утиными языками только в том, что тут из-за этого надо при определении полиморфной функции заранее определять конкретные операции, чтобы где-то внутри вычислился тип. Но это требование для стороннего наблюдателя ничем не хуже требования определить функцию перед её вызовом.
Haskell менее утиный, чем python/JS, но более утиный, чем C++ без шаблонов.
roman-kashitsyn 14.11.2017 00:56 # +7
ты отравился ворециями, скорее вызывай скорую
1024-- 14.11.2017 01:30 # +1
Строгость типизации в C++ можно нивелировать перегрузкой операторов и шаблонами. Статичность типизации - нагромождением своих приблуд с void* или virtual (см. мой пример динамических слабых питухов в C++).
Все эти обзывательства в адрес типизаций отражают лишь положение по умолчанию и оценку "по большей степени".
Но C++ без перегрузки операторов и операторов-кастов, без указателей и virtual и без шаблонов предоставлял бы намного меньше возможностей для динамической слабой питушни. Аналогично - с boost::any, std::any и моей питушнёю. В первом случае возможность где-то есть, но не официально в языке, во втором - возможность официально в языке, в третьем - в сторонней библиотеке или в обычном коде. И мой код в теории может пройти путь от сторонней библиотеки до std и синтаксического сахара, меняя положение C++ в пространстве типизации, меняя сложность использования (от скачивания сторонней питушни до использования на уровне конструкций языка или стандартной библиотеки).
И бинарное да/нет только смущает, порождая холивары и оговорки.
Впрочем, в моём случае холивары были бы насчёт характеристической функции типизации.
SemaReal 15.11.2017 00:22 # 0
Интерфейс там выводится, точно как тип.
Вот тебе пример строгой, статической, и при этом утиной типизации в волшебном псевдо языке. (Подобные штуки есть в статически типизированных функциональных языках)
В нее можно скормить любой объект, у которого есть проперти нужного типа с нужными именами. Ему не нужно явно имплементить интерфейс, достаточно просто иметь такие проперти.
Это вполне можно проверить статически, например на этапе компиляции.
roman-kashitsyn 15.11.2017 00:34 # 0
SemaReal 15.11.2017 00:40 # 0
Я точно помню что в каком-то функциональном оно было, может быть в OCaml?
roman-kashitsyn 15.11.2017 00:42 # +1
Я двумя комментами выше об этом написал.
>> Толи дело OCaml.
1024-- 15.11.2017 08:38 # 0
Где-то выше (http://govnokod.ru/23492#comment393616) я как раз писал, что мне кажется, что утка - отдельное измерение в пространстве типизации.
В последнем комментарии я показывал, что в C++ можно манипулировать строгостью и статичностью вплоть до их искоренения, намекая на то, что и по оси утиности можно двигаться туда-сюда.
> AcceptStudent
> в волшебном псевдо языке
Крестошаблоны какие-то. Их я даже в том комментарии неделю назад упоминал.
roman-kashitsyn 07.11.2017 22:15 # 0
В нормальных языка это фича. Компилятор найдёт за тебя все места, которые нужно проапдейтить.
> Дикты пизже
пока ты не захочешь использовать их как ключи в мапе
SemaReal 07.11.2017 22:18 # 0
roman-kashitsyn 07.11.2017 22:26 # 0
Да, я имею в виду, что дикты нельзя использовать как ключи диктов.
SemaReal 07.11.2017 22:32 # 0
Но вообще я не уверен что я хочу видеть дикты с диктами внутри. Такие композиты лучше строить уже из объектов, имхо
subaru 07.11.2017 22:21 # 0
> пока ты не захочешь использовать их как ключи в мапе
Вообще я за структуры, у которых надо явно указывать имена полей в инициализаторах. Типа кортеж с адресацией полей по имени, а не индексу. Это конечно фантазии, а не питон.
SemaReal 07.11.2017 22:24 # +1
А тремя строчками выше Роман написан
>>Key = collections.namedtuple('Key', ['word', 'number'])
SemaReal 07.11.2017 22:20 # 0
В питоне это литерал для set, кстати.
subaru 07.11.2017 22:27 # 0
SemaReal 07.11.2017 22:35 # 0
Мне казалсоь что даже в няшной можно
нет?
subaru 07.11.2017 22:38 # 0
subaru 07.11.2017 22:40 # 0
SemaReal 07.11.2017 22:47 # +2
roman-kashitsyn 07.11.2017 22:38 # +1
SemaReal 07.11.2017 22:46 # +3
Я думал что в крестах всё почти можно, что в няшной. Всё таки C99 уже давно все умеют.
ААА
A few additions to C99 (compared with C89) were deliberately not adopted in C++:
[1] Variable-length arrays (VLAs); use vector or some form of dynamic array а alloca можно?
[2] Designated initializers; use constructors
блин! Теперь я ТОЧНО знаю что НЕЛЬЗЯ писать через слешик "c/c++"
SemaReal 07.11.2017 19:44 # +4
а кроме шуток такие штуки надо делать через gnu gettext
https://www.gnu.org/software/gettext/manual/html_node/Plural-forms.html
bormand 07.11.2017 20:01 # 0
SemaReal 07.11.2017 20:05 # +5
bormand 07.11.2017 20:09 # 0
SemaReal 07.11.2017 20:14 # +4
``<meta name="Generator" content="makeinfo">``
Так что должен один-в-один повторять info gettext
Даже как-то удивительно что хоть что-то в этом мире делается ПРАВИЛЬНО
samopisiets 09.11.2017 16:36 # 0