
Ilya
18.09.2017
11:10:29
В смысле валидность перестановки?

Masson
18.09.2017
11:11:01
Ребята, а игры на хаскеле никто не пробовал делать?

kana
18.09.2017
11:11:11
Зачем?)

Ilya
18.09.2017
11:11:21
Существование такой перестановки уже говорит нам, что массивы из одних и тех же эл-ов

Google

Ilya
18.09.2017
11:12:08
Любой алгоритм сортировки должен уметь её выдавать. Некоторые по сути так и работают даже. Но не всё.

kana
18.09.2017
11:12:21
Ну да, цепочка пруфов, что перестановка двух элементов дает те же элементы, пруфом перестановки и будет являться)

? animufag ?
18.09.2017
11:18:19

Евгений
18.09.2017
11:18:51
https://hackage.haskell.org/package/Raincat же

? animufag ?
18.09.2017
11:18:59
в твитерке все так восторжено к ней отнеслись

Евгений
18.09.2017
11:19:30
Хотя хз собираются ли сейчас дождекоты

? animufag ?
18.09.2017
11:19:43
Home page http://raincat.bysusanlin.com/

Евгений
18.09.2017
11:20:01
Правильный -> http://bysusanlin.com/raincat/

Masson
18.09.2017
11:20:23
Спасибо. Но там вроде бы 2008 год.
Помню была какая-то библиотека, крутецкая.

Евгений
18.09.2017
11:20:41
Ну она клёвая

Alexander
18.09.2017
11:23:24
ещё про танки было что-то

Ilya
18.09.2017
11:26:24
Ну да, цепочка пруфов, что перестановка двух элементов дает те же элементы, пруфом перестановки и будет являться)
Если функция сортировки записана как
sort :: Vec n a -> Vec n a
то нам нужно гарантировать, что
а) элементы нового вектора = элементы старого вектора
б) новый вектор отсортирован
Теперь, если функция сортировки записана как
sort :: Vec n a -> AscVec n a
где AscVec n a - вектор с возрастающими элементами длины n
то нам достаточно гарантировать только а), б) уже следует автоматом
А другой подход может быть в том, чтобы записать сортировку как
sort :: Vec n a -> Perm n a
где Perm n a - перестановка длины n
теперь нам надо проверять б), а а) уже есть

Google

Ilya
18.09.2017
11:26:34
я не знаю, какой подход лучше. с идрисом не знаком

Alexander
18.09.2017
11:28:42
в сортировке надо нужно выдать на выходе перестановку элементов, которая приводит к сортированному списку, если я правильно понимаю
собственно вот "другой подход"

Ilya
18.09.2017
11:29:14
ну я это и написал:)

Alexander
18.09.2017
11:29:18
с unqiue types есть халяву (неформальная)
если у нас есть длина и новый список, то из этого должно следовать, что это перестановка
т.к. мы не можем ни дублировать, ни брать элементы из ниоткуда, ни забывать
это верно если метод полиморфный по элементу только
доказать не просите =)

Misha
18.09.2017
11:31:02

Ilya
18.09.2017
11:31:08
насчёт дублирования непонятно как следует из полиморфности

Alex
18.09.2017
11:31:16
еще на сортировку иногда навешивают пруф complexity

Alexander
18.09.2017
11:31:24
уникальность/линейность требует
в смысле что дублировать нельзя
если нету полиморфности, то ничего не запрещает создать новый элемент
т.е. если есть Unique a то мы не можем создать, a
а если это Unqiue Int мы можем сделать Unique 0
если у нас a то мы не можем ничего с элементами делать

Ilya
18.09.2017
11:32:43

Alexander
18.09.2017
11:33:01
наверное

Google

Ilya
18.09.2017
11:33:08
только сортировки на swap`ах

Alexander
18.09.2017
11:33:33
я думаю подсчетом не уклыдвается в сигнатуру где попросят перестановку на выходе
т.е. это другой класс
что не удивительно, т.к. там ты требуешь новую операции над элементами

Bohdan
18.09.2017
11:47:47
Optparse applicative
А что, в хачкеле есть ограничения на переносы и отступы, как в пайтоне? Объявляю strOption, ставлю закрывающую скобку отдельной строкой — parse error. Сливаю с предыдущей строкой — компилится. Треш какой-то

Aleksey
18.09.2017
11:48:46
Отступы играют роль, да
Если переносишь на другую строку, то отступ должен быть увеличен
Впрочем, можно писать с {, } и ; :)

Bohdan
18.09.2017
11:53:19
И execParser возвращает кортеж, получается? Из него можно достать конкретный аргумент по имени?

Aleksey
18.09.2017
11:53:43
fst / snd
или через паттерн матчинг
let (foo, bar) = execParser ...
execParser возвращает то, что конструирует аппликатив - потому и -applicative в имени пакета
Если пасер вернет record, то и доступ к опциям будет по имени (по имени поля рекорда)
Прямо в README у optparse-applicative есть пример

Vasiliy
18.09.2017
11:58:51
execParser тащемта IO возвращает

Bohdan
18.09.2017
11:59:56
Хм, что-то System.Random теперь отвалился

Aleksey
18.09.2017
12:00:09

Vasiliy
18.09.2017
12:00:10
но a внутре IO a - тот, что конструируется аппликативом

Bohdan
18.09.2017
12:00:28
Не импортится, хотя поставлен и на предыдущем коммите компилилось

Google

Bohdan
18.09.2017
12:01:06
Мде, и после отката не компилится, по ходу, cabal пакет потерял, это как вообще?

Ilya
18.09.2017
12:03:27
вроде же не такая сложная штука?
т.е. where не в конце, а где-нибудь в середине, по месту надобности
ну про let я знаю, если что
то есть let есть, а where нет, как-то странно

kana
18.09.2017
12:05:23
Ну лет - выражение же
where же - захардкоренный синтаксический стейтмент

Ilya
18.09.2017
12:06:24
да, я понимаю:) что трудно придумать рассахаренную версию такого локального where
но почему вообще это должно быть решающим фактором
возможность развернуть любую do-нотацию в >>= и >>

Alexander
18.09.2017
12:36:34
foo = do
bar baz
where baz = ....
qux doox
where doox = ...
where
doox = ...
?
такое что-то?

Yuriy
18.09.2017
12:37:51

Alexander
18.09.2017
12:38:12
я пытаюсь понять этого ли хочет @Masteroid
или это про то, что у меня 2 первые where на разном уровне?

Ilya
18.09.2017
12:41:12

Alexander
18.09.2017
12:41:27
то, что я напсал не поддерживается
я спрашиваю, такое ли хочется

Ilya
18.09.2017
12:41:55
хочется как во втором варианте здесь

Google

Ilya
18.09.2017
12:41:58
так работает
main = do
x <- f
print x
where f = readLn :: IO Int
а так нет
main = do
x <- f
where f = readLn :: IO Int
print x

kana
18.09.2017
12:42:25
Я правильно понимаю, что все, что в where, будет видно всему коду выше ?

Ilya
18.09.2017
12:42:34
у меня да
в первом варианте

kana
18.09.2017
12:42:56
do
f a
f b where a = 1
f c
where f x = ...

Aleksey
18.09.2017
12:45:39
не надо такого, это попахивает жаваскриптом!

kana
18.09.2017
12:46:46
Не очень понимаю, зачем это нужно, если есть лет, который субъективно лучше читается
Я с каждым днем лучше и лучше понимаю Эвана, который отказывается впилить where в элм

Aleksey
18.09.2017
12:47:31
let в do понятно рассахаривается - слева-направо сверху-вниз
where нормально смотрится вне тела функции, т.к. не является выражением
@Masteroid как должен рассахариваться where в середине do при условии, что where не может быть частью выражения?

Ilya
18.09.2017
12:50:14
да, я понимаю:) что трудно придумать рассахаренную версию такого локального where
но почему вообще это должно быть решающим фактором
возможность развернуть любую do-нотацию в >>= и >>

Aleksey
18.09.2017
12:50:36
Потому что это говорит об отсутствии магии.
Есть чуть другая форма записи, но то что является выражением (do - является) - им и остаётся.
Если хочется where в do, то почему бы тогда let не убрать вообще? И data разрешить внутри do
И классы с инстансами и импорты!
И получим s/говно/питон/

Ilya
18.09.2017
12:53:57

Aleksey
18.09.2017
12:54:36
f :: D -> D
f = do
data D = Foo | Bar
g :: D -> D
g Foo = Bar
g Bar = Foo
export D
g . g
не хочу такое