
Friedrich
29.05.2017
12:26:45
игры?
https://github.com/ForNeVeR/1969/

Roman
29.05.2017
12:27:13

Friedrich
29.05.2017
12:27:16
Но не обольщайтесь, там вообще ничо нету. Я пока только начал.

Google

Anton
29.05.2017
12:27:17
@fvnever го как нибудь в скайп какой. Расскажешь хоть, как это кушать и что я смогу сделать.
А то я пока что только понял, как цвет бекграунда менять :D

Friedrich
29.05.2017
12:27:49
Но это единственное, что там есть!
Ты познал 100% кода :)

Anton
29.05.2017
12:28:29
Дык это, сходим куда переговорить вечером по поводу этого дела?

Friedrich
29.05.2017
12:28:33
Если чо, я щас пилю там рудиментарную рендерилку и некую модель миссии: https://github.com/ForNeVeR/1969/pull/13

Anton
29.05.2017
12:28:42
И, может ещё кто с нами пойдёт.

Friedrich
29.05.2017
12:29:25
Я этим и занимаюсь.

Anton
29.05.2017
12:29:54
Но я не имею не малейшего понятия, как пилить это. Не разу игры не пилил.

Friedrich
29.05.2017
12:30:03
Тю, я тоже :D

Vasily
29.05.2017
12:31:54
Я когда -то пытался описать предметную область Settlers of Catan, но чет застрял на гексах

Nikolay
29.05.2017
12:34:21

Google

Nikolay
29.05.2017
12:34:40
Правильное дело делаете

Anton
29.05.2017
12:37:03
А что если в F# функция не помечена как «rec» но код её вызывает сам себя. Или компилятор этого не позволит ?

Friedrich
29.05.2017
12:37:53

Anton
29.05.2017
12:38:31
Ага, ясно. А я то смотрю сейчас товарища @shwars и вижу у него функция fact помечена как rec
и задумался "Эм, а просто так низя что ли рекурсию вызывать? 0_o"

Friedrich
29.05.2017
12:39:25
Рекурсивные функции специально помечаются явным образом, чтоб нельзя было наворотить случайно.

Anton
29.05.2017
12:39:41
удобно

Friedrich
29.05.2017
12:39:42
Не представляешь, сколько я таких косяков выловил в C#-продакшене :)

Anton
29.05.2017
12:39:52
я так один раз писал экстеншен и вызвал его же в себе.
даже не спрашивай, чем я думал.
У меня студия упала нафиг :D ( когда вызвал код)

Dmitri
29.05.2017
12:41:14
Смысл rec отчасти исторический и берет начало от ранних ML-языков. Идея в том, что let и let-rec - это разные конструкции с точки зрения трансляции в лямбда-исчисление.

Friedrich
29.05.2017
12:41:43
Хм, и правда. Об этом я не задумывался.

Anton
29.05.2017
12:42:38
Ого, вот оно как. И что мы имеем в лямбда-исчислении, когда пишем let-rec ? Можно ли какой-нибудь мини пример для наглядности разницы let и let-rec на уровне лямбда-исчисления ? (если такое вообще возможно)

Friedrich
29.05.2017
12:47:15
letrec через Y-комбинатор, очевидно.
https://github.com/morganey-lang/Morganey/blob/master/std/src/main/resources/std/functions.mgn#L13 — вот он.

Anton
29.05.2017
12:47:43
я про этот Y-комбинатор уже раз 20 слышал. Но так и не знаю, что это такое.

Friedrich
29.05.2017
12:49:15
Я лучше в привате расскажу :)
А то тут народ иногда ругается на такие вот пересказы основ для начинающих.

Nikolay
29.05.2017
12:49:42
Я бы тоже послушал

Google

Nikolay
29.05.2017
12:49:47
Про Y комбинаторы
Надо тогда создать канал: "FSharp для самых маленьких"

Friedrich
29.05.2017
12:50:20
Короче, Y-комбинатор это один из т.н. "комбинаторов неподвижной точки".

Anton
29.05.2017
12:50:24
Угу, я бы там был главным флудером.

Nikolay
29.05.2017
12:50:31
И про fparsec ещё интересно

Anton
29.05.2017
12:50:54


Friedrich
29.05.2017
12:50:58
Я щас поясню, спокойно. Надо ж термины сначала ввести
Задача комбинаторов неподвижной точки состоит в том, чтобы получить, собственно, неподвижную точку функции. Это такая точка, в которой значение функции перестаёт меняться при её дальнейшем применении (т.е. f(x) = x). Например, функция factorial(x) = x == 1 ? 1 : x * factorial(x - 1) перестаёт меняться при x = 1.
Эти комбинаторы используются при изучении всякого рода низкоуровневого функционального программирования (в частности, в лямбда-счислении).
Комнибатор отличается тем, что вызывает функцию "рекурсивно", применяя её к её собственным результатам прошлой итерации. При этом комбинатор необязательно сам должен использовать рекурсию (скажем, на каком-нибудь C# вы можете представить себе реализацию комбинатора циклом).
Ссылку на то, как можно представить Y-комбинатор в лямбда-счислении, я уже дал выше: https://github.com/morganey-lang/Morganey/blob/00056ad1750b5aa3944a8d7fd936df7156612c6d/std/src/main/resources/std/functions.mgn#L13
Если долго на него смотреть и думать, то можно понять, как он работает. Я уже несколько раз понимал, но всё время опять забываю :)


Nikolay
29.05.2017
13:02:11
Задача комбинаторов неподвижной точки состоит в том, чтобы получить, собственно, неподвижную точку функции. Это такая точка, в которой значение функции перестаёт меняться при её дальнейшем применении (т.е. f(x) = x). Например, функция factorial(x) = x == 1 ? 1 : x * factorial(x - 1) перестаёт меняться при x = 1.
Эти комбинаторы используются при изучении всякого рода низкоуровневого функционального программирования (в частности, в лямбда-счислении).
Комнибатор отличается тем, что вызывает функцию "рекурсивно", применяя её к её собственным результатам прошлой итерации. При этом комбинатор необязательно сам должен использовать рекурсию (скажем, на каком-нибудь C# вы можете представить себе реализацию комбинатора циклом).
Ссылку на то, как можно представить Y-комбинатор в лямбда-счислении, я уже дал выше: https://github.com/morganey-lang/Morganey/blob/00056ad1750b5aa3944a8d7fd936df7156612c6d/std/src/main/resources/std/functions.mgn#L13
Если долго на него смотреть и думать, то можно понять, как он работает. Я уже несколько раз понимал, но всё время опять забываю :)
А на F# нет такого?)


Roman
29.05.2017
13:02:32
Задача комбинаторов неподвижной точки состоит в том, чтобы получить, собственно, неподвижную точку функции. Это такая точка, в которой значение функции перестаёт меняться при её дальнейшем применении (т.е. f(x) = x). Например, функция factorial(x) = x == 1 ? 1 : x * factorial(x - 1) перестаёт меняться при x = 1.
Эти комбинаторы используются при изучении всякого рода низкоуровневого функционального программирования (в частности, в лямбда-счислении).
Комнибатор отличается тем, что вызывает функцию "рекурсивно", применяя её к её собственным результатам прошлой итерации. При этом комбинатор необязательно сам должен использовать рекурсию (скажем, на каком-нибудь C# вы можете представить себе реализацию комбинатора циклом).
Ссылку на то, как можно представить Y-комбинатор в лямбда-счислении, я уже дал выше: https://github.com/morganey-lang/Morganey/blob/00056ad1750b5aa3944a8d7fd936df7156612c6d/std/src/main/resources/std/functions.mgn#L13
Если долго на него смотреть и думать, то можно понять, как он работает. Я уже несколько раз понимал, но всё время опять забываю :)
https://www.wikiwand.com/ru/Комбинаторная_логика + https://www.wikiwand.com/ru/Комбинатор_неподвижной_точки


Friedrich
29.05.2017
13:02:36

Roman
29.05.2017
13:02:49

Nikolay
29.05.2017
13:02:53

Friedrich
29.05.2017
13:03:07
Готовой нету. Есть явная хвостовая рекурсия; смысла в такого рода комбинаторах нету :)

Nikolay
29.05.2017
13:03:49
Меня прям разрывает, так хочется всё изучить

Roman
29.05.2017
13:04:11

Friedrich
29.05.2017
13:04:38
Ну и вообще хорошая статья, да. Дельная.

Roman
29.05.2017
13:05:05

Google

Dmitri
29.05.2017
13:05:26
На F#: let rec y f x = f (y f) x
при этом факторал запишется так без рекурсии: let fact = y (fun f n -> if n=0 then 1 else n*f(n-1))
а если ввести ещё несколько вспомогательных определений:
let s f g x = f x (g x)
let k x y = x
let c f a b = f b a
let cond p f g x = if p x then f x else g x
то факториал будет выглядеть так: let fact = y(cond((=)1)(k 1)»((s(*))«(c(«)(c(-)1))))

Roman
29.05.2017
13:07:14

Friedrich
29.05.2017
13:07:24
Такое ощущение, что Дмитрий это всё прям вот щас на мобиле быстренько набросал!

Dmitry
29.05.2017
13:07:57
если ничо не путаю

Dmitri
29.05.2017
13:08:02
:) курс на курсере будет, но скорее к сентябрю

Roman
29.05.2017
13:08:10

Friedrich
29.05.2017
13:08:52

Nikolay
29.05.2017
13:10:02
let rec y f x = f (y f) x
А может кто-нибудь эту конструкцию расписать подробнее? Хотя-бы с типами, что-то я не понимаю

Roman
29.05.2017
13:10:43

Dmitri
29.05.2017
13:10:48
Сейчас хороший курс есть на MVA: http://aka.ms/fsharp

Roman
29.05.2017
13:11:40

Igor
29.05.2017
13:12:18
Народ, у вас работает шорткат “send selected to fsi” в VSCode (особенно интересно на macOS)?

Nikolay
29.05.2017
13:13:05

Igor
29.05.2017
13:14:46

Nikolay
29.05.2017
13:15:11

Google

Roman
29.05.2017
13:16:04

Igor
29.05.2017
13:16:06
А что пишет
Ничего, просто я добавляю свою комбинацию, а он не сохраняется.
дефолтная просто не срабатывает..

Nikolay
29.05.2017
13:16:54
Или у тебя проблема только с шорткатом?

Igor
29.05.2017
13:17:21
Все разрешилось, после перезапуска показались конфликты - удалил и вроде теперь работает.
Кстати, что-нибудь слышно по FSI на coreclr?

Anton
29.05.2017
13:27:32
@shwars спасибо за примеры.

Pawel
29.05.2017
13:32:26
@shwars
А как посоветуете сделать чтобы все привязки let в модуле были вычислены автоматически? Наиболее идиоматичным для F# способом

Vasily
29.05.2017
13:36:18
do?
Или про другое?

Pawel
29.05.2017
13:37:20
do не поможет если имя из привязки явно не вызывается
в F# все вычисления начинаются в [<EntryPoint>]. Мне нужно вычислить все привязки в порядке объявления. Сейчас я это делаю явным вызовом и это просто бесит, наверное самое печальное что есть в F#
при чём это поведение зависит от __DEBUG__

Vasily
29.05.2017
13:42:10
А если либа, то где начинаются?

Pawel
29.05.2017
13:42:35
там, где она вызывается естественно

Vasily
29.05.2017
13:42:38
И я кейса не понял, где нужно вычислить все привязки
Из реальной жизни
Для решения какой проблемы нужны подобные вычисления? Я понимаю, что сейчас задаю очень тупой вопрос