@Fsharp_chat

Страница 498 из 772
Kirill
06.03.2018
13:42:55
ооп отстой — это всем известно

но приходится это терпеть из-за хайпа

Vlad
06.03.2018
13:43:12
с чего же

Kirill
06.03.2018
13:43:34
с того, что алгебраические типы данных шире и гибче

Google
Vasily
06.03.2018
13:43:40
Почему?
с т.з. впф биндинги - это всего лишь часть отображения, и тащить их куда-то в код моделей, например, смысла нет

Bonart
06.03.2018
13:43:41
Vasily
06.03.2018
13:43:50
Модели должны быть максимально чистые

Alex
06.03.2018
13:45:22
Просто время ооп проходит. Было время дирижаблей, теперь время сверхзвуковых.

Evgeniy
06.03.2018
13:45:36
Давайте прекратим "ООП против ФП" срач и пойдем читать шестую главу Expert F#.

Andrey
06.03.2018
13:45:44
Лель.

Roman
06.03.2018
14:01:19
это какие?
Tuples, Discriminated Unions

Siarhei
06.03.2018
14:03:56
Pavel
06.03.2018
14:07:08
Фига себе гибче, они же не изменяемые!

Friedrich
06.03.2018
14:32:06
Ох, шутники :)

Kirill
06.03.2018
16:17:57
а в чем их широта и гибкость?
Вместо тысячи слов http://fprog.ru/2009/issue2/roman-dushkin-algebraic-data-types/

Google
Klei
06.03.2018
17:35:10
Вместо тысячи слов http://fprog.ru/2009/issue2/roman-dushkin-algebraic-data-types/
Автор привел пример из OCaml, который является валидным (за исключением отсутствующего |) и говорит, что подобное невозможно в F#. Он чего-то не знал, или когда-то в F# реально было так? // "4 АТД в других языках программирования"

Kirill
06.03.2018
17:38:11
не понял вопроса

Klei
06.03.2018
17:42:17
Это же неверно: В языке программирования F# АТД реализованы ограниченно исключительно в виде безопасных с точки зрения типизации размеченных объединений (union), то есть все АТД в языке F# являются типами-суммами. Например: type SomeType = | Constructor1 of int | Constructor2 of string

Вот это приводится как полное АТД из OCaml: type suit = Spades | Diamonds | Clubs | Hearts;; type card = Joker | Ace of suit | King of suit | Queen of suit | Jack of suit | Number of suit * int ;;

В F# же можно также.

Или я неправильно понял?

Диёр
06.03.2018
17:43:49
;; в окамл просто убивает

A64m
06.03.2018
17:45:13
причина для этого еще убийственней, но это больше для соседнего чата про написание компиляторов

Anna
06.03.2018
17:46:52
а то там на скукотищу жалуются

Roman
06.03.2018
18:14:36
;; в окамл просто убивает
Оно и в f# есть, это команда для интерпретатора,а не для компилятора

В F# же можно также.
По моему можно

Klei
06.03.2018
18:17:26
То что сейчас можно, я знаю. Вопрос в том, а) автор заблуждался, б) когда-то синтаксис F# это реально это не позволял или в) я не заметил какой-то фишки?

Klei
06.03.2018
18:58:15
Evgeniy
06.03.2018
19:01:56
@Kleidemos Раньше в DU можно было даже records пихать. :)

Klei
06.03.2018
19:04:08
А зачем выпилили?

Ivan
06.03.2018
19:06:42
Так до сих пор и пихают

Evgeniy
06.03.2018
19:07:16
Так до сих пор и пихают
Не пихают, ну, в том смысле, что record надо в отдельном типе объявлять.

Google
Evgeniy
06.03.2018
19:19:05
https://github.com/fsharp/fslang-suggestions/issues/52

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

Klei
06.03.2018
19:22:56
Ок. Не то что бы я согласен, но причин достаточно для сохранения статус-кво.

A64m
06.03.2018
19:25:26
в окамле сделали

Fill
06.03.2018
19:27:51
может глупый вопрос, но всё же вот делаю я свой тайп type Queue<'a> = Queue of 'a list*'a list | Empty и мне надо, что бы если листы пустые, значение инварианта было Empty. Можно ли этого добиться, не делая тип приватным?

т.е. я не хочу терять возможность создания интсанса вот так Queue([],[]), но чтоб он сразу в Empty устанавливался

Evgeniy
06.03.2018
19:30:06
Ок. Не то что бы я согласен, но причин достаточно для сохранения статус-кво.
Да. В F# есть named union fields, а в OCaml пошли по пути использования встроенных записей.

Fill
06.03.2018
19:31:54
т.е. типо если у меня будет активвный шаблон на Empty, то и проблемы как бы не существует?

не нравится мне это

Klei
06.03.2018
19:34:09
Если у тебя будет отдельный вариант под Empty и ничем не защищенный Queue, который может принимать абсолютно эквивалентное значение, будет еще хуже.

Fill
06.03.2018
19:34:21
очевидно

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

Fill
06.03.2018
19:36:57
чую подвох

1

Fill
06.03.2018
19:38:49
приватный тип - говно, не удобно использовать будет. Если бы мне нужны были классы, я бы на C# писал

Google
Roman
06.03.2018
19:39:26
https://twitter.com/k_cieslak/status/971058295480995841

Fill
06.03.2018
19:40:15
Evgeniy
06.03.2018
19:41:22
не подходят оба варианта
Я не знаю других способов. По поводу неудобно — active patterns немного сглаживают ситуацию.

Fill
06.03.2018
19:43:13
По поводу, м, отношения к классам — шестая глава Expert F#. ;)
мне нравятся рекорды и инварианты в использовании, я не готов отказываться от этого ради инкапсуляции

но ладно, спасибо за ответы

Evgeniy
06.03.2018
19:44:30
Ну, ок, можешь накостылять свой NonEmptyList и зафорсить их в типе Queue. Но это тоже некоторое неудобство.

Fill
06.03.2018
19:45:02
ещё какое

будут те же проблемы, только уже с листом

буду делать приватный тип в общем(

Klei
06.03.2018
19:46:06
DU нужен для того, чтобы сделать невалидные состояния непредставимыми. Если мы остаемся верны 'a list * 'a list, то Empty в виде case вообще не нужен.

A64m
06.03.2018
19:46:32
ну на DU можно какие-то инварианты энкодить, но делая неправильные состояния непредставимыми, т.е. без сохранения возможности пустую очередь как Q [] [] создавать

Fill
06.03.2018
19:47:20
к слову лист то может быть пустым

но не оба листа

Klei
06.03.2018
19:47:49
Так тебе же предложили сделать один из листов NonEmpty.

Ну, ок, можешь накостылять свой NonEmptyList и зафорсить их в типе Queue. Но это тоже некоторое неудобство.

Fill
06.03.2018
19:48:00
один

и какой же?

они оба могут быть пустыми

но не одновременно

Google
A64m
06.03.2018
19:48:24
в одном конструкторе первый, во втором второй, третий без списков

Fill
06.03.2018
19:48:40
это же приватный тип

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

Ivan
06.03.2018
19:49:43
Очень помогли бы overloads with match. Но это ближе к динамике. что то типа: type NonEmptyList<'t> = NonEmptyList of 't list let create([al] as l) = NonEmptyList l let create(h::t as l) = NonEmptyList l

Fill
06.03.2018
19:50:25
ладно, а кто знает, как в F# сделана родная очередь?

Klei
06.03.2018
19:50:55
type 'a Queue = | A of 'a list * 'a NonemptyList | B of 'a NonEmptyList | C

A64m
06.03.2018
19:51:00
зачем приватный? Q1 of a list * a nonEmpty | Q2 of a nonEmpty * a list | Empty

Klei
06.03.2018
19:51:37
Я вижу, что могу идти спать. @A64m_qb0 добъет.

Fill
06.03.2018
19:52:42
Evgeniy
06.03.2018
19:52:56
Fill
06.03.2018
19:53:54
Есть только дотнетная.
фига себе. Сразу вопрос - много ли вообще в F# своих структур данных?

персистентных

A64m
06.03.2018
19:55:17
была же в fsharpx очередь, когда я на f# писал. что, куда-то пропала?

Fill
06.03.2018
19:56:34
List, Set, Map
спасибо

Evgeniy
06.03.2018
19:56:49
Она на месте, я про FSharp.Core
https://github.com/fsprojects/FSharpx.Collections/blob/master/src/FSharpx.Collections/Queue.fs

Roman
06.03.2018
20:05:57
https://blogs.msdn.microsoft.com/dotnet/2018/03/06/f-language-and-tools-update-for-visual-studio-2017-version-15-6/

Evgeniy
06.03.2018
20:06:47
BEWARE! https://twitter.com/kot_2010/status/971012683926564866

https://twitter.com/VBragilevsky/status/971094451862032384

Страница 498 из 772