amd63 13.03.2013 08:46 Azoth

"Не могу создать"-псто: @komar, ты можешь для нубаса в один абзац написать, почему ты больше окамлишься, чем хаскелишь? // Потому что у нубаса в голове крутится "Шо то — ML, шо это — ML"

Recommended by:

@gelraen: тред о программировании на псаче. Удивительно.

and @ulidtko
1. komar 13.03.2013 08:48 thinkpad

Разблеклистил.
Потому что хаскель — говно.

2. komar 13.03.2013 08:50 thinkpad

Давай по-другому. Ты раньше на чем писал?

3. amd63 13.03.2013 08:52 Azoth

Я ожидал абазца в стиле "В окамле можно/мненравится <1,2,3,4,5> а вот в хаскеле так нельзя/неудобно/некрасиво/нелюблю"

4. amd63komar /1 13.03.2013 08:54 Azoth

вот те конкретные места, которые говно, они же имеют аналог в окамле? эти аналоги — чуть менее говно/вообще не говно, потому что.....?

5. komaramd63 /3 13.03.2013 08:54 thinkpad

В окамле мне нравится то, что это быстрый, простой и выразительный, но не тонущий в обосракциях язык. Хаскель же мне напоминает помойку.
Впрочем, тебя действительно ебет то, почему я выбираю окамл, а не хаскель, или же тебе нужен ответ на вопрос «а что мне самом лучше освоить»?

6. komaramd63 /4 13.03.2013 08:55 thinkpad

В окамле нихера нету.

7. gds 13.03.2013 08:59

в х-е ленивость — сильно усложняет рассуждения о ресурсоёмкости и производительности кода.
в х-е тайпклассы — усложняют раскопки "откуда блядь взялся код, который работает для a + b".
в х-е нет нормальных модулей, которые очень важны для написания среднего/большого софта. (на однострочники не распространяется.)
в х-е обязательно обмазываться несколькими слоями манаток, тогда как в окамле это — только при необходимости и по собственному желанию (у меня, например, часто такое желание есть, но не всегда).
в х-е "чистота" не так уж много гарантирует, а гемора доставляет ощутимо, тогда как в окамле вполне можно писать чистый код с тем же успехом.
типовые извращения х-я — таки извращения в плохом смысле слова. В окамле берут coq, пишут на нём сколь угодно сложную логику работы с типами, экстрактят в окамл, используют.

8. komargds /7 13.03.2013 09:00 thinkpad

> в х-е нет нормальных модулей, которые очень важны для написания среднего/большого софта. (на однострочники не распространяется.)
А что с ними?

9. gdskomar /8 13.03.2013 09:03

с однострочниками? — ничего особо, модули там не нужны.

с модулями? — они не умеют в сигнатуры. О какой абстракции можно говорить после всего этого? Далее, нет функторов над модулями. Отдельная история — если тебе надо будет работать одновременно с двумя мапками со строковым ключём, в одной из которых операция сравнения будет case insensitive, например.

11. komargds /9 13.03.2013 09:05 thinkpad

Сигнатур? Функторов? Блять, не верю. Были же вроде.

12. gdskomar /10 13.03.2013 09:05

подборка постов замечательная.

13. gdskomar /11 13.03.2013 09:08

а, ёпта. Есть способ не вытаскивать наружу функции и представления типов. Но по сравнению с .mli — отсос.

14. komargds /13 13.03.2013 09:12 thinkpad

Загуглил функторы в х-ле, везде пишут про аппликативные функторы. Я запутался в этой вашей терминологии. В х-ле можно ебануть модуль, который можно будет обхуяривать другими типами и значениями и получать специализированные модули?

15. amd63 13.03.2013 09:13 Azoth

@komar и @gds как-то сконцентрировались на недостатках х-ля. В /0 шла речь про "лично для тебя красивые/удобные/правильные плюсы окамла", то есть ответ ожидался в противоположном направлении. Не "оно жрёт много солярки, поэтому велосипед", а "приятно с друзьями, ветер в лицо, поэтому не машина" стиль ответа.
Ответьте плиз больше употребляя слово окамл, а то у вас постоянно слово "х-ль" в ответе :(

16. komargds /7 13.03.2013 09:13 thinkpad

Блять, нажал не туда.

> в х-е "чистота" не так уж много гарантирует, а гемора доставляет ощутимо, тогда как в окамле вполне можно писать чистый код с тем же успехом.

Все хаскеллисты дрочат на чистоту же.
И не дай Бог заюзать чего-то, что ПОДРЕЗАЕТ КРЫЛЬЯ ОПТИМИЗАТОРУ.
Как всегда у хаскеллистов, такое дрочерство никакого практического смысла не имеет, и в итоге получается #tsfhsf #tsfhse #tsffze #tsfith

17. gdskomar /14 13.03.2013 09:14

нет.

18. komaramd63 /15 13.03.2013 09:17 thinkpad

Блять, я нихуя не понимаю, какого ответа ты ждешь.
Ветер в лицо, да. Друзей нету, потому что на нем пишет 35 человек во всем мире. Поэтому не х-ль.

19. komargds /17 13.03.2013 09:17 thinkpad

Давай им папир напишем.

20. amd63komar /18 13.03.2013 09:22 Azoth

Я ждал "В окамле и вот есть, и вот есть, и вот есть — и это всё красота".
Получил "В х-ле и вот есть, и вот есть, и вот есть — и это всё говно".

Я ждал "Окамл, ведь удобно/красиво/правильно, вот смотри:....."
Получил "Окамл, а что ещё? Выхода нет. Ведь в х-ль и усложнён, и гемор, и манатки"

21. komaramd63 /20 13.03.2013 09:24 thinkpad

Да ебать тебя в рот.
Ты хочешь, чтобы я по заданному тобой шаблону ответил?
Ты хочешь, чтобы я смотивировал тебя изучать это говно?

22. gdsamd63 /15 13.03.2013 09:28

в окамле по умолчанию строгий порядок вычислений, что упрощает рассуждения о производительности и ресурсоёмкости кода. (опциональная явная ленивость — в наличии.)

я начинал использовать окамл одновременно с чтением ассемблерного кода, который он генерит, и теперь имею вполне точное представление, что во что компилируется. Из этого я узнал, что цена абстракции в окамле — минимальная, если и есть вообще.

в окамле всегда легко сказать, какой код возьмётся для компиляции данного выражения — например, если написано "a + b", и "+" не переопределяется открытыми модулями (а таких очень мало, почти нет), то я имею гарантию того, что это скомпилируется в одну машинную инструкцию add.

в окамле есть модули с возможностью гибко ограничить структуру сигнатурой. Кроме того, есть функторы (над модулями) — способ создать модуль на основании других модулей. Как пример этого — http://caml.inria.fr/pub/docs/manual-oca...

в окамле есть возможность несложным образом использовать сайдэффекты, что удивительно для функционального языка программирования. Эти сайдэффекты по производительности не хуже дёрганья сишечьки напрямую — например, почти всё из http://caml.inria.fr/pub/docs/manual-oca... — это простые-тупые обёртки над сишными функциями.

в окамле есть подтипизация как на sum types (можно сказать "на индуктивных типах данных"), называется "polymorphic variants", так и на record types, называется "objects".

есть возможность использовать coq для работы с хитрыми типами. Хотя и в х-е это можно, но х-евым эстетам обычно что-то не нравится в результатах экстракции, поэтому они используют агду, которая, на мой взгляд, проигрывает coq'у.

поддерживаются все парадигмы, кроме "логического программирования", в том числе, для особых ценителей, есть грамотное (безопасное и типопроверяемое) ООП. Хотя нахуй оно нужно — не знаю. А вот объекты ( = "записи с подтипизацией") — очень даже нужны.

с другой стороны, не советую окамл в двух случаях:
1. если нужно multicore, но нет возможности асилить message passing / fork / jocaml,
2. если дохуя эстет и не хочешь понимать, что "+" и "+." это разные операции, и в коде должны быть обозначены по-разному.

23. amd63komar /21 13.03.2013 09:28 Azoth

Я подумал в языке что-то успело понравиться. А не из ненависти к другому языку.
Не писать на языке А только потому, что на языке B всё ещё хуже. Как-то так.

24. komargds /22 13.03.2013 09:29 thinkpad

epic
Особенно последнее.

25. gdskomar /19 13.03.2013 09:30 umodni14B972E4

я те шо, академик? Или ты меня таким образом пытаешься оскорбить??77777777

26. amd63gds /22 13.03.2013 09:30 Azoth

Во, спасибо

27. ygrekgds /22 13.03.2013 09:34 kiwi

3. windows, всё печально, я как-то успел забыть, да жизнь напомнила недавно

28. gdsygrek /27 13.03.2013 09:34

да можно там нормально жить, была бы необходимость. Конечно, говноебство, но шо делать.

29. komargds /25 13.03.2013 09:36 thinkpad

Вот у нас здесь хаскеллистов много, понимаешь. Смотри, хаскеллисты. Он тебе спать мешают. хаскеллисты. Я, вот, давай здесь папир напишу, и они все прилетят сюда, и запилят функторы, слышишь? И тебе тогда спать будет хорошо. Давай?

30. amd63komar /29 13.03.2013 09:37 Azoth

:)

31. ygrekgds /28 13.03.2013 09:38 kiwi

жить то можно, но надо знать как. ты это попробуй объясни "нормальному" виндузятнику как собрать пару биндингов, не твоих

32. gdskomar /29 13.03.2013 09:39 umodni14B972E4

кажется, я начинаю о чём-то смутно догадываться...

33. gdsygrek /31 13.03.2013 09:42 umodni14B972E4

это да.

34. komargds /22 13.03.2013 09:44 thinkpad

Кстати, недавно подумал, что было бы неплохо составить простую статейку о том, что во что компилируется.

35. gdskomar /34 13.03.2013 12:20

так вперде! Или влом?

36. komargds /35 13.03.2013 14:23 thinkpad

Да надо.

Сейчас сходил в camlinternalOO.ml. Ебаный свет, а и не думал, что вся эта хуйня в рантайме творится.

37. 0xd34df00dgds /7 13.03.2013 14:29 Azoth_primary

Ты ничего не понимаешь в смысле функциональщины.

38. komar0xd34df00d /37 13.03.2013 15:12 thinkpad

Разумеется, смысл функциональщины в том, чтобы написать курсовую, обмазавшись манатками, и при этом 30 раз похвалившись в бложик. И после этого идти писать на крестах.
А этот долбоеб на окамле программы пишет.

39. gdskomar /36 13.03.2013 16:30

с точки зрения использования объектов — мало что из этого в рантайме делается. А если работают с закрытым объектным типом, то вообще method lookup по индексу делается.

40. komargds /9 13.03.2013 16:32 thinkpad

Мне тут сейчас сообщили, что функторы не нужны, раз есть тайпклассы.

41. gds0xd34df00d /37 13.03.2013 16:34

научи же меня, о великий плюсогуро!

42. gdskomar /40 13.03.2013 16:37

ну да, и обмазываться различными newtype по большой нужде. Можно, было бы желание.

43. komargds /9 13.03.2013 16:44 thinkpad

Во, гляди, уже все сделали: http://hackage.haskell.org/packages/arch...

44. gdskomar /43 13.03.2013 17:13 umodni14B972E4

да верю. Лепим тип, заворачиваем в него (конструируем значение на каждый чих), разворачиваем, используем тайпкласс-машинерию для всей работы. Сравни с окамловским подходом.

45. komarkomar /40 14.03.2013 12:07 thinkpad

@kb, ты нормально комментарий написать не мог?

46. komarkomar /45 14.03.2013 12:10 thinkpad

ОП, разъебань этого мудака для конструктивной дискуссии.

47. amd63komar /46 14.03.2013 12:10 Azoth

doen

48. komarkomar /40 14.03.2013 12:13 thinkpad

Ну вот гляди.
Объясняю я человеку, что вот, есть окамл, и в нем есть функторы. Что, вот, берем мы функтор Map, хуячим туда функцию для сравнения и тип для данных. И заебись. А он мне говорит, дескать, нахуй все это надо, когда есть тайпклассы? Вот берем мы, допустим, тип строки, определяем для него инстанс Ord и суем его в х-льную хуйню для Map’ов. И заебись.

49. amd63komar /48 14.03.2013 12:20 Azoth

Можно написать реализацию слева на окамле, справа на х-ле, и будет видно — где больше этого "заебись".

50. komaramd63 /49 14.03.2013 12:21 thinkpad

Там нихуя не будет видно. Как мы уже установили, видно будет тогда, когда нам понадобятся две мапы с разной сравнивающей функцией.

51. amd63komar /50 14.03.2013 12:22 Azoth

Осталось придумать задачку, где без этого никуда, и реализовать на двух языках.

52. komaramd63 /51 14.03.2013 12:22 thinkpad

Только нахуй все это надо?

53. amd63komar /52 14.03.2013 12:23 Azoth

я думал у вас тут с @kb сейчас конструктивной дискуссии будет. а он молчит.

54. kbkomar /48 14.03.2013 12:23 8585817211363262399403928

может я просто не понимаю, что такое функторы в окамле? В хаскеле это тайпкласс Functor с операцией fmap.

55. kbamd63 /53 14.03.2013 12:24 8585817211363262399403928

со мной дискуссия о подобных темах обычно односторонняя (т.к. знаний у меня мало), потому уж конструктивной ждать не стоит.

56. komarkb /54 14.03.2013 12:25 thinkpad

Да, не понимаешь.

57. gdskb /54 14.03.2013 12:37

точно не то. В окамле функторы — такие высокоуровневые модули, которые берут модули как аргументы и возвращают модуль-результат. Там выше дал ссылку на Map.Make — вот оно. Даёшь модуль с типом и сравнением на этом типе, а Map.Make возвращает модуль для работы с avl tree, где ключ имеет указанный нами тип, а сравнения при работе с деревом осуществляются нашей функцией сравнения.

58. komargds /57 14.03.2013 12:39 thinkpad

Кстати, во что функторное говно потом комплируется?

59. gdskomar /58 14.03.2013 12:52 umodniA480CF7A

интуиция подсказывает, что при создании функтора создаётся что-то вроде записи, содержащей значения модуля-результата, а его использование — в module_record[index_of_value].

60. amd63 14.03.2013 12:56 Azoth

Functors are “functions” from structures to structures.

If you keep the signature of the input structure and the signature of the output structure constant,
you are free to change the implementation details without affecting any of the modules that use it.

Functors allow you to write code that will work irrespective of the implementation of the given structure,
and produces a structure containing functions that we are free to modify, but only have to change in one location, that of the functor.

61. komargds /59 14.03.2013 12:58 thinkpad

http://caml.inria.fr/cgi-bin/hump.en.cgi... ← ох лол.

62. gdskomar /61 14.03.2013 12:59 umodniA480CF7A

ты бы ещё говно мамонта раскопал.

64. komargds /62 14.03.2013 13:02 thinkpad

> ты бы ещё говно мамонта раскопал
> OCaml

65. gdskomar /64 14.03.2013 13:05 umodniA480CF7A

смешная шутка!

66. ulidtkogds /57 14.03.2013 13:29

казалось бы: зачем нам нужен параметрический полиморфизм.

лучше будем вместо типов параметризовать модули!

67. gdsulidtko /66 14.03.2013 13:31 umodniA480CF7A

тут недостаточно параметризовать тип типом, нужно как минимум параметризовывать тип значением ( == зависимые типы).

68. ulidtkogds /67 14.03.2013 13:35

make_map :: (k → Ordering) → Map k v

опять же, на этом примере не вижу необходимости.

69. ulidtkoulidtko /68 14.03.2013 13:37

м, блджад, у функции сравнения два аргумента, ну вы понели.

70. amd63ulidtko /69 14.03.2013 13:38 Azoth

А ты сможешь /50 и /51 ?

71. gdsulidtko /69 14.03.2013 13:39 umodniA480CF7A

а потом кто-нибудь будет использовать Map k v, созданный на string и compare_string_case_insensitive при работе с простыми string (с обычной функцией сравнения), и с известным результатом.

72. ulidtkogds /71 14.03.2013 13:45

ты можешь инстанциировать вот этот модуль Map с двумя разными функциями сравнения — и получить два разных типа Map?

что тебя убережёт от использования Map с compare_string_case_insensitive в местах, где ты хотел использовать другой Map? у обоих типов ведь будет одинаковая сигнатура, я правильно понимаю?

73. gdsulidtko /72 14.03.2013 13:57 umodniA480CF7A

получу два разных _модуля_ Map. Убережёт то, что Map_string.t 'a <> Map_string_insensitive.t 'a (для любого типа значений 'a). Типы разные.

74. ulidtkogds /73 14.03.2013 14:19

но публичный интерфейс (сигнатура) у них одинаковый, так ведь?
или сигнатур будет две, параметризованных функцией сравнения вместе с модулем?

в общем, вопрос: я могу писать код, который без изменений будет работать с обоими получившимися типами, или нет?
ну, конкретно любой абстрактный алгоритм, которому похуй на детали реализации и подробное упорядочивание в этих мапах, которому просто нужны ключи и значения.

75. gdsulidtko /74 14.03.2013 14:32 umodniA480CF7A

сигнатура отличается, так как в ней тип, представляющий дерево, получается разным.

Код, работающий с любым деревом, написать можно. Для этого код надо завернуть в функтор, берущий нужный модуль как параметр. Или, если работа предстоит несложная, то можно передать в этот абстрактный алгоритм просто нужные функции, например:

# module M = Map.Make(String);;
module M :
[skipped]
# let f find str map = find (str ^ str) map;;
val f : (string → 'a → 'b) → string → 'a → 'b = <fun>
# f M.find "asd" (M.add "asdasd" 123 M.empty);;
- : int = 123
#

76. kbulidtko /68 14.03.2013 15:00 21967501741363267040223977

что-то я всё равно не догоняю, что ты дальше будешь делать. В х-ле ведь сравнение определено для типов значений (пофиг ключи сравнивать или value). То есть, если ты хочешь создать мапу, у которой ключи будут сравниваться case-insensitive, тебе нужно параметризирвовать тип ключа, вместо String объявив его

newtype ICString = ICString { unICString :: String }

и определив для него `instance Ordering ICString`.

Если же необходим такой Map, в который при складывании значений String они будут потом сравниваться через case-insensitive, то тебе необходимо как-то переопределить функцию `put` (или как она называется, `insert`?) и все остальные функции, принимающие String, чтоб они его превращали в ICString.

Или я чего-то не понял?

77. snakehoneyulidtko /66 14.03.2013 18:55 kokoko

Прочитал этот комментарий в обсуждении того, зачем тапиру такой длинный член. Задумался.

78. rtsomegds /9 16.03.2013 10:11

"толпы быдла долбятся в стену не видя двери — для них выпиливают люк" (с)

79. gdsrtsome /78 16.03.2013 10:13 umodniA63A5C27

не понял, разверни.

80. rtsomegds /57 16.03.2013 10:20 home

какой-то бред с новыми корявыми сущьностями для решения частной проблемы, когда можно просто взять тайпклассы.

81. gdsrtsome /80 16.03.2013 13:02 umodniA63A5C27

тайпклассы — какой-то бред с новыми корявыми сущностями для решения частной проблемы, когда можно просто взять модули.

82. rtsomegds /81 16.03.2013 13:04 home

ты какой-то неосилятор плюсов.

83. gdsrtsome /82 16.03.2013 13:04 umodniA63A5C27

не "какой-то", а вполне сознательный неосилятор плюсов, если ты про язык погромирования.

84. rtsomegds /83 16.03.2013 13:06 home

нет бессознательный.
т.е. подолбиться любишь, но плюсы неосилил. поэтому долбишься всякой левой хуйнёй.

85. gdsrtsome /84 16.03.2013 13:07 umodniA63A5C27

не люблю я никуда долбиться, тебе показахлось.

86. rtsomegds /85 16.03.2013 13:07 home

мне кажется что это тебе кажется что тебе показалось.

87. gdsrtsome /86 16.03.2013 13:08 umodniA63A5C27

</thread>. Неконструктивно.

88. ulidtkogds /81 16.03.2013 13:29

прости, но здесь ты не прав

89. amd63gds /87 16.03.2013 13:35 Azoth

Я предложил конструктивно в /48-/49-/50-/51 и что мне ответил @komar? Он ответил /52. Хотите конструктивно — сконструируйте. А то вы говорите на разных языках. Одни говорят на окамле, другие говорят на хаскеле — и блять искренне удивляются, почему нет понимания между участниками.

90. amd63gds /87 16.03.2013 13:48 Azoth

Хотя лично я замечательнй ответ о прелестях окамла получил ещё в твоём /22 и можно было закрывать тему после /39. Но в /40 пришёл @komar и решил тему "В окамле и вот есть, и вот есть, и вот есть — и это всё красота" превратить в чатик с топиком "бросание друг в друга говном". Хотя любому участнику дискуссии понятно, что для решения конкретной задачи следует использовать тот инструмент, который наиболее удобен для решения этой конкретной задачи. Короче, [РЕШЕНО]

91. gdsulidtko /88 16.03.2013 13:51 umodniA63A5C27

поиск значения по типу — коряво. Типы — штука, нужная для ограничения кода с целью добавления статических гарантий. Довешивать на типы ещё и "поиск инстанса (значения)" — бред.
Так и оказывается: в случае, когда нужно на один тип навесить более одного значения (пример — разные сравнения для строк), начинается кривизна, пляски с newtype и подобным, только чтобы наебать тот корявый функционал "резолвинга инстансов".

92. gdsamd63 /90 16.03.2013 13:52 umodniA63A5C27

да я вроде особо не бросался говном, если чо. А на неконструктив от @rtsome отвечать как-то лень. Что-то делаю не так?

93. rtsomegds /9 16.03.2013 14:00 home

> Типы — штука, нужная для ограничения
о, ещё один статиканутый уебан. откуда вы лезете блеать? что, до сих пор не видели словосочетания "type level programming" штоле?
>на один тип навесить более одного значения (пример — разные сравнения для строк
для самых тупых цитирую википедию: ...determines the possible values for that type; the operations that can be done on values of that type...
неудивительно что для подобного наёба системы типов приходится как-то извращаться.
пиздец мне припекает от вашей с комаром статиканутости.

94. amd63gds /92 16.03.2013 14:02 Azoth

Я все ответы на вопрос из /0 получил. Если кто-то в виде бонуса не поленится ещё сконструировать пример с этими злополучными "одновременно с двумя мапками со строковым ключём, в одной из которых операция сравнения будет case insensitive" из которого будет ОЧЕВИДНО, как безблагодатно будут вынуждены ипстись хаскелисты по сравнению с окамлобогами — то это токмо на пользу дела и в посрамление @rtsome

95. rtsomeamd63 /94 16.03.2013 14:05 home

ОЧЕВИДНО что "ОЧЕВИДНО" всем сразу не будет.

96. ulidtkogds /91 16.03.2013 14:07

ничего этот твой «поиск инстанса» не бред; ты забываешь, что абсолютно всё с типами во времени компиляции ты не сможешь сделать, и в той или иной форме придёшь к рантаймным типам.

ньютайпы для альтернативных инстансов — да, не решение; но мое мнение здесь такое, что нужно изначально правильно параметризовать свой тип. Алсо, всегда можно забить хуй на статические гарантии™ и заюзать smart constructor, как я уже показывал итт.

97. amd63rtsome /95 16.03.2013 14:07 Azoth

Ну как же. Если в спор "Молоток или микроскоп" заслать две картинки — одну про "микробы смотреть" другую про "гвоздь забивать", то всем будет очевидно, для чего какой инструмент нужен.

98. ulidtkortsome /93 16.03.2013 14:13

от «более одного значения на тип» я тоже прихуел, но он имел ввиду другое: что типа один статический тип может содержать значения разных РАНТАЙМНЫХ типов. Например, когда в плюсах наследование с vtable, имеем раздельно статический тип переменной и раздельно рантаймное RTTI-«значение», асоциированное с каждым конкретным инстансом, и разное для разных наследников статического типа, и описывающее *рантаймный* тип каждого конкретного инстанса.

99. ulidtkoulidtko /98 16.03.2013 14:14

ебать я нагородил блджад

100. amd63 16.03.2013 14:15 Azoth

"Давайте конструктивно"-гет

101. rtsomeulidtko /98 16.03.2013 14:15 home

рантаймность — это другая плоскость, но сказано было "засунуть два типа в один", да.

102. ulidtkoamd63 /94 16.03.2013 14:18

там максимум что получится показать — это что хачкель не будет СРАТЬ ОШИБКАМИ, если ты в аргумент типа «регистроНЕчувствительный мап» засунешь регистрочувствительный, сорт оф типа того

работать будет (и даже не выглядеть говном), но вынудит ПИСАТЬ ТЕСТЫ, видимо.

103. gdsrtsome /93 16.03.2013 14:19 umodniA63A5C27

"type level programming" не нужно, слишком много неявного там творится. Конечно, кому как, но мне обычно нужно, чтобы написанный код явно отражал то, что именно он делает.

> the operations that can be done on values of that type...

ну вот, есть как минимум две разные операции сравнения. Тут у нас консенсус.

а если припекает — ну, что ж поделаешь. Извени...

104. amd63ulidtko /102 16.03.2013 14:20 Azoth

Ты сконструируй и покажи. А "там, наверное, получится только ...., видимо" это как-то слабенько, слабенько. От тебя-то я большего ожидал :(

105. ulidtkoamd63 /104 16.03.2013 14:21

мне лень, прости; просто попиздоболить без пруфов охота

106. gdsulidtko /96 16.03.2013 14:21 umodniA63A5C27

> ты забываешь, что абсолютно всё с типами во времени компиляции ты не сможешь сделать

в системах с высокоуровневыми типами, типа coq, вполне так всё могу сделать, и многого не будет видно в рантайме.

про "параметризовать свой тип" — как это будет для примера с разными сравнениями строк? Не понимаю.

107. gdsulidtko /98 16.03.2013 14:26 umodniA63A5C27

я имел ввиду НЕ другое. Уточню, что я имел ввиду. По _типу_ String ищется инстанс Ord String, из этого инстанса берётся _значение_ — функция упорядочивания строк.
Фактически, тайпклассы — это способ брать значение по типу.
То есть, по данному типу можно найти 0..1 значение (0 — инстанса нет, 1 — инстанс есть). Проблема начинается, когда хотим, чтобы всё, что завязано на Ord, брало нестандартное значение для данного типа — например, функцию сравнения строк без учёта регистра.

108. gdsrtsome /101 16.03.2013 14:27 umodniA63A5C27

нет, "засунуть два типа в один" я не говорил.

109. rtsomegds /103 16.03.2013 14:29 home

>слишком много неявного
define явно
ну и это говорит человек фапающий на camlp4
>у нас консенсус.
не было такого

110. rtsomegds /106 16.03.2013 14:31 home

>в системах с высокоуровневыми типами, типа coq,
мышление уровня golden hammer
в хачкеле более чем выразительная система типов для твоей задачи

111. gdsrtsome /109 16.03.2013 14:31 umodniA63A5C27

лол, я не фапаю на camlp4. Вообще. Синтаксические расширения считаю говном.

112. gdsrtsome /110 16.03.2013 14:31 umodniA63A5C27

откуда блядь ты знаешь мои задачи???

113. rtsomegds /112 16.03.2013 14:32 home

ну то что ты тут рассказываешь про хешмап

114. gdsrtsome /113 16.03.2013 14:33 umodniA63A5C27

это не моя задача, это пример того, где в х-е будет некрасиво, а в окамле — красиво.

116. ulidtkogds /106 16.03.2013 14:35

я принципиально убеждён, что «многого» ты таки не сможешь убрать из рантайма. Это интуиция уровня «нельзя написать вебсервер, вычисляющий ответы на запросы ещё во время компиляции». Понимаешь?
Мы можем специализировать многие функции, статически ограничивая их аргументы; но с «внешними», неизбежно рантаймными данными (think: user input, disk, network IO) такие фокусы не сработают.

Скажем, можешь в Coq написать структуру данных вида коллекции чисел (ну как обыкновенный список интов) — которая заполнится юзером на манер do { input := fromUser; theCollection.append(input); } while (input != 0); — и которая сможет гарантировать безопасное индексирование с проверкой границ *не в рантайме*?

я ОЧЕНЬ удивлюсь, если сможешь. По-моему, это принципиально недостижимо.

117. ulidtkogds /107 16.03.2013 14:38

это то же самое, но другими словами. Можно сказать, что по типу берётся значение некого абстрактного дескриптора рантаймного типа (который уже содержит в себе актуальную функцию сравнения)

118. rtsomeulidtko /116 16.03.2013 14:42 home

>нельзя написать вебсервер, вычисляющий ответы на запросы ещё во время компиляции
но ведь можно же!

119. gdsulidtko /116 16.03.2013 14:46 umodniA63A5C27

смогу-смогу. Суть: количество элементов пихается в тип (получается тип, зависящий от значения), и дальше при любой работе с этой структурой данных мне надо будет предоставлять пруф того, что 0 <= i < count. Если я буду работать с коллекцией в пределах coq, у меня известно, откуда берутся индексы (например, делаю цикл i = от 0 до count-1 — там легко доказать это ограничение на i), и везде я смогу построить пруфы. Далее, при экстракции (в окамл, в х-ь) "количество элементов" будет стёрто из типа, все пруфы будут стёрты систематическим образом, и будет просто код вида
let rec get i lst =
match lst with
| [] → assert false
| [h :: t] → if i = 0 then h else get (i — 1) t
заметь assert false — до этой ветки выполнение не дойдёт.
Если же окажется, что индекс элемента, который хочу взять, доставляют снаружи — тут конечно, придётся проверить его в рантайме. Но это достаточно сделать один раз, потом проверки не нужны.

120. ulidtkogds /119 16.03.2013 15:00

> Если я буду работать с коллекцией в пределах coq, у меня известно, откуда берутся индексы

в пределах Coq ты можешь сделать ввод списка от юзера через цикл while как я показал?
для наглядности, что я прошу:

>>> theList = []
>>> while True:
... x = int(input())
... if x == 0:
... break
... else:
... theList.append(x)
...
3
5
9
0
>>> theList
[3, 5, 9]

Заметь, здесь нет цикла i = 0..count-1. Здесь цикл while, условие завершения которого зависит от юзерского ввода.

121. gdsulidtko /120 16.03.2013 15:05 umodniA63A5C27

да, это я смогу сделать. Возьму свою наколенную манатку для ввода-вывода (ввод-вывод делается средствами окамла, coq-код при экстракции это использует), дальше всё как в х-е.
Разве что один coq-специфичный момент: нужно доказать завершимость этой функции. Однако, добавив в эту функцию работу со счётчиком "сколько максимум элементов читать", и вызывая функцию со счётчиком, равным 10^100, можно не беспокоиться о завершимости.

122. ulidtkogds /119 16.03.2013 15:07

> Если же окажется, что индекс элемента, который хочу взять, доставляют снаружи — тут конечно, придётся проверить его в рантайме. Но это достаточно сделать один раз, потом проверки не нужны.

нуууу окей, близко, но всё равно не совсем то. Я добиваюсь признания того, что ВНЕ ЗАВИСИМОСТИ от крутости спектра статических проверок сколь угодно хорошей системы типов полезные программы (то есть, взаимодействующие с внешним миром) без рантаймных аналогов статических проверок не обойдутся. Принципиально. Это как отец Тьюринг, non-termination и святой дух.

123. ulidtkogds /121 16.03.2013 15:08

покажи плиз

124. gdsulidtko /122 16.03.2013 15:11 umodniA63A5C27

смотря что считать "статическими проверками". _Какие-то_ проверки — по-любому будут. Без них (без использования инструкций условного перехода процессором) только неинтересное можно сделать.
И типы тут не при чём — всё в типах не записать, они не для того нужны. (а для чего — уже говорил в этом итт треде.)

125. gdsulidtko /123 16.03.2013 15:12 umodniA63A5C27

достаточно будет coq-кода, или реализацию манатки (окамловское) тоже показывать? Дело в том, что я её для продакшона писал, а оттуда выносить код как-то нехорошо.

126. ulidtkogds /124 16.03.2013 15:37

да обыкновенные статические проверки. Проверка совпадения количества аргументов у функции, к примеру. Обычное ведь дело, так? Даже в последнем ссаном говне мамонта делается во время компиляции.
А если функция создана/импортирована/сгенерирована/загружена из какого-нибудь .gir [1] в рантайме?..

[1]: https://git.gnome.org/browse/gobject-int...

вот как быть с такой хуйней в статической системе типов? не писать же, блядь, в конце концов
data GIRFunction = GIRFunction String [GIRType] Ptr — name, params, body
data GIRType = Int | Bool | String | Array [GIRType] | ...

... и потом везде, где её надо запустить, втыкать какой-нибудь evalFunction с оборачиванием параметров в соответствующие конструкторы значения GIRType... не забывая рантаймные проверки соответствия типов и количества параметров нашей сладкой GIRFunction. И вот как здесь обойтись исключительно статическими проверками? Никак. Только в рантайме.

127. ulidtkogds /125 16.03.2013 15:38

ну, типа, если там BIND @ RETURN, то я и так пойму

128. 0xd34df00drtsome /84 16.03.2013 16:23 Aedalus

А я заебись тогда.

129. snakehoney0xd34df00d /128 16.03.2013 16:24 kokoko

ты вообще дедфуд

130. 0xd34df00damd63 /90 16.03.2013 16:25 Aedalus

Это же комар, хуле ты хотел.

131. 0xd34df00drtsome /93 16.03.2013 16:30 Aedalus

Как мне показалось, @gds вообще о том же // или хз, за тредом не слежу.

132. rtsome0xd34df00d /131 16.03.2013 16:30 home

о чём же?

133. kbulidtko /126 17.03.2013 10:21

Да точно так же, как и с длинной массива (насколько я понял), вообще принципиальной разницы не вижу. В чем проблема доказать, что при каком-то кол-ве аргументов k у считанной (пусть в рантайме) функции, ты никогда не вызовешь над ней eval, передав ей неравное k кол-во аргументов?

134. ulidtkokb /133 18.03.2013 08:06

хотя бы в том, что во время построения доказательства значение k неизвестно?

135. 0xd34df00dulidtko /134 18.03.2013 08:07 Azoth_primary

Достаточно ограничить любым наперед заданным (например, size_t).

136. ulidtko0xd34df00d /135 18.03.2013 08:10

и это убережет меня от передачи трех аргументов функции, принимающей еще-неизвестно-сколько?

как?
я в упор не понимаю, как это возможно.

137. kbulidtko /134 18.03.2013 08:53

Что неизвестно? Известно, что k будет интеджером, например. Так вот зачем знать точное значение k, чтоб иметь возможность доказывать, что оно останется тем же, что и массив аргументов? Тебе достаточно будет просто вставить где-то проверку на равенство (Len(arts) == k), и компилятор будет в состоянии все понять (правда, это все мои мокрые фантазии, сам я не пробовал)

138. gdsulidtko /136 18.03.2013 10:06 umodniA63A5C27

спокуха, покажу код, поглядишь, что там возможно, а что нет.

140. amd63 22.03.2013 18:35 Azoth

Друзья, как я уже упомянул в /90 тему можно было закрывать после /39.
Но теперь, когда вы столько наговорили, я напоследок вот что скажу:
Вот посмотрите, как я в /104 пристаю к @ulidtko а он говорит "мне лень"
И тут я совершенно по другому поводу нагуглил один сайт, и там можно сделать именно то, о чём я влажно фантазировал в /49
Итак, господа — взгляните и содрогнитесь — http://langref.org/haskell+ocaml/solved
Всё уже придумано до нас!

141. komaramd63 /140 22.03.2013 18:42 thinkpad

Ну и какую полезную информацию можно извлечь из этой хуйни?

142. amd63komar /141 22.03.2013 18:46 Azoth

Ну вот гляди. Ты написал в /48 текст в стиле "берём, хуячим, и заебись". А вместо этого идёшь по ссылке — и так за тебя взяли, захуячили и заебись.
Только по ссылке — наглядно и с пруфами, а вы тут без пруфов 100 камментов заслали, не понимая друг друга. Потом что так всегда: когда споришь без пруфов, то споришь о словах и их неодинаковом понимании. Нахуй так жить, посоны?

143. komaramd63 /142 22.03.2013 18:47 thinkpad

Друх, из этой хуйни я смог узнать только то, что в окамле стдлибы нету.
Отличные комментарии были в #tsfgse/7 и #tsfgse/22

144. amd63komar /143 22.03.2013 18:49 Azoth

Я про /7 и /22 и не спорю, я очень рад, что @gds сюда заглянул и подробно расписал.

145. gdsamd63 /140 22.03.2013 18:58

я содрогнулся. Какой ебанат их учил писать на окамле? Кроме того, если нужно решение не низкоуровневое, то есть "батарейки", где многие вещи решаются в пару строк, а не в те простыни.

Do you really want to delete ?