- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
function fib<T>(n: T) {
return n <= 2 ? n : fib(n - 1) + fib(n - 2);
}
function main()
{
print (fib(5));
print (fib(6.0));
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
0
function fib<T>(n: T) {
return n <= 2 ? n : fib(n - 1) + fib(n - 2);
}
function main()
{
print (fib(5));
print (fib(6.0));
}
я вам принес "рекурсивные генерики"..... внимание вопрос... а каким таким хером получилось вычеслить тут возвращаемый тип, а ?
ASD_77 04.02.2022 19:55 # 0
ASD_77 04.02.2022 19:55 # 0
Hu3KoypoBHeBblunemyx 04.02.2022 19:57 # +1
bormand 04.02.2022 20:01 # +1
Возможно вы имели в виду индуктивные?
CHayT 04.02.2022 22:32 # +1
guest6 04.02.2022 22:35 # +2
Naf-Naf 04.02.2022 22:39 # +2
bormand 05.02.2022 03:07 # +1
ASD_77 04.02.2022 20:09 # +1
JloJle4Ka 05.02.2022 02:55 # 0
В яжасцрипт только один численный тип, float64?
ASD_77 05.02.2022 18:31 # 0
bormand 05.02.2022 03:03 # 0
В момент инстанциации?
JloJle4Ka 05.02.2022 03:05 # 0
bormand 05.02.2022 03:07 # 0
JloJle4Ka 05.02.2022 03:16 # 0
bormand 05.02.2022 03:20 # +1
JloJle4Ka 05.02.2022 03:22 # 0
bormand 05.02.2022 03:23 # +1
ASD_77 05.02.2022 18:32 # 0
ASD_77 05.02.2022 18:32 # 0
j123123 05.02.2022 18:39 # 0
j123123 05.02.2022 18:41 # 0
Рекурсивная функция вполне может "зациклиться".
То, что рекурсивная функция не зареркурсируется до бесконечности, еще надо доказать
ASD_77 05.02.2022 18:46 # 0
bormand 05.02.2022 18:51 # 0
ASD_77 05.02.2022 19:11 # 0
Hu3KoypoBHeBblunemyx 05.02.2022 19:39 # 0
bormand 05.02.2022 19:43 # +1
Конпелятор подумает -- "бесконечная функция без побочек -- это UB, значит она не будет вызвана, значит можно выбрать любой тип, пусть будет void".
Hu3KoypoBHeBblunemyx 05.02.2022 19:44 # 0
bormand 05.02.2022 19:58 # 0
Ниже конпелятор тебе поясняет эту ошибку: template argument deduction/substitution failed, couldn't deduce template parameter `T1'.
Т.е. он в момент конпеляции четвертой строчки искал какой-нибудь подходящий shit, но вариант с шаблоном не подошёл т.к. невозможно определить T1, а других вариантов и нету.
Floating_cockerel 06.02.2022 09:46 # 0
Floating_cockerel 06.02.2022 09:47 # 0
bormand 06.02.2022 09:55 # 0
Но ты не указал T1 в строке 4 явно, а вывести его (по правилам крестов, когда вывод от аргументов к результатам) нельзя. Поэтому данный шаблон не подошёл. А других вариантов не нашлось.
ASD_77 05.02.2022 19:33 # 0
bormand 05.02.2022 20:08 # +1
Да, это какой-то тип содержащий ноль, но почему int32? В принципе, подходит любой другой тип с нулём. И функция может вернуть что угодно при a != 0.
ASD_77 05.02.2022 20:25 # 0
ASD_77 05.02.2022 20:27 # 0
ISO 05.02.2022 21:07 # 0
guest6 05.02.2022 21:10 # +2
Он и про P=NP докажет
ASD_77 05.02.2022 20:29 # 0
Soul_re@ver 05.02.2022 20:47 # +1
В данном случае, возможно.
Но перепиши код как
И, без обработки всего остального кода, тип возвращаемого значения в точности не узнаешь.
bormand 05.02.2022 20:56 # 0
Тайпскрипт -- это не система доказательства теорем, сойдёт и более консервативный тип в духе int | float или даже any...
Soul_re@ver 05.02.2022 21:19 # 0
... и возвращаемое значение функции было разработано настолько, что туда помещался любой объект.
Вообще в тайпскрипте скучно. Не то, что в крестах — перегрузка операторов, (частичная) специализация, ADL... Вопрос, что вызовется, может стать увлекательной головоломкой.
bormand 05.02.2022 21:20 # 0
Но с ним ничего нельзя было сделать, не вытащив обратно с помощью каста.
ASD_77 05.02.2022 21:25 # 0
guest6 05.02.2022 21:26 # +1
В С++ есть перезгрузка операторов
Яблоко минус int может быть груша
ASD_77 05.02.2022 21:28 # 0
Soul_re@ver 05.02.2022 21:38 # 0
Предлагаю поработать нейронкой и дописать код, чтобы работало поведение.
guest6 05.02.2022 21:40 # 0
Hu3KoypoBHeBblunemyx 05.02.2022 21:50 # 0
guest6 12.05.2022 15:30 # 0
ASD_77 05.02.2022 22:17 # 0
1) return shit(a - 1) какой имеет возвращаемый тип? случайный? - нет. он всегда предопределён. а что определяет возвращаемый тип функции shit? это строка "return 0" и строка "return 1.0". больше return в коде нет. значит список типов возвращаемых в shit - всегда предопределен и он конечен.
guest6 05.02.2022 22:21 # 0
к сожалению, нет. Он зависит от того, какого типа выражение "a - 1".
Допустим, оно типа "яблоки".
Но какого типа выражение "яблоки минус 1"?
Допустим, оно типа "апельсины".
Но какого типа выражение "апельсины минус один"?
И так до бесконечности.
Когда Алан Тюринг это понял, он обмокнул ножик в яде, разрезал яблоко, и съел половинку... и погиб:((((
Soul_re@ver 05.02.2022 22:26 # 0
И всё становится просто прекрасно и легко вычисляемо.
guest6 05.02.2022 22:29 # 0
Ну да, мы же можем сказать, что в общем случае у нас такое вот поведение, но если тип равен именно апельсину, то логика вообще совершенно другая.
Кресты такие кресты
ASD_77 05.02.2022 22:49 # 0
ASD_77 05.02.2022 22:50 # 0
Soul_re@ver 05.02.2022 23:06 # 0
http://coliru.stacked-crooked.com/a/6f521a764aef91f5
ASD_77 05.02.2022 23:14 # 0
Soul_re@ver 05.02.2022 23:22 # 0
ASD_77 05.02.2022 23:28 # 0
ASD_77 05.02.2022 23:30 # 0
bormand 05.02.2022 23:41 # 0
Так то да, бывают забавные эффекты, когда один цпп файл видит хедер со специализацией, а во второй его подключить забыли и там работает общий случай. Но это в общем-то даже не UB, просто неприятные различия в поведении.
> кто первый
Не, там всё сложнее. В каждой точке, где ты вызываешь функцию, составляется список вариантов, фильтруется, сортируется и выбирается "самый подходящий". Если выживет несколько кандидатов -- будет ошибка, а не первый.
ASD_77 06.02.2022 02:40 # 0
bormand 06.02.2022 08:34 # 0
Это другое, это нарушение ODR когда одноимённая функция в разных юнитах трансляции как-то получилась с разным телом.
А у разных специализаций имена разные, линкер их не мержит между собой.
З.Ы. Но если ты напишешь в джвух файлах разные специализации для одного типа -- вот там да, имена совпали, нарушение ODR, UB, кишки, распидорасило.
guest6 06.02.2022 05:42 # 0
Q: Почему одна и та же функция у меня в одном месте тормозит, а в другом летает?
A: Потому что нужно подключить petuh.hpp.
Реально ведь магия уровня Ruby: подключаешь файл, и всё начинает работать иначе
ASD_77 05.02.2022 22:54 # +1
j123123 11.03.2022 00:11 # 0
guest6 16.02.2022 03:59 # 0
OPAHrymaH 16.02.2022 04:10 # 0
ASD_77 05.02.2022 19:13 # 0
bormand 05.02.2022 19:16 # +1
CHayT 05.02.2022 19:29 # +2
Наконец-то кто-то решил проблему остановки.
Hu3KoypoBHeBblunemyx 05.02.2022 19:30 # +1
CHayT 05.02.2022 19:39 # +1
ASD_77 05.02.2022 19:50 # 0
CHayT 05.02.2022 19:52 # 0
ASD_77 05.02.2022 20:05 # 0
bormand 05.02.2022 21:05 # +1
На js это очень просто: function f() { return f; }. А теперь расставь типы.
bormand 05.02.2022 21:21 # +1
Блин, у них и на это ответ есть: type Fn = () => Fn.
Hu3KoypoBHeBblunemyx 05.02.2022 21:24 # +1
bormand 05.02.2022 20:58 # 0
ASD_77 05.02.2022 21:37 # 0
JloJle4Ka 05.02.2022 03:19 # 0
Hu3KoypoBHeBblunemyx 05.02.2022 19:32 # 0