
A64m
01.02.2018
21:48:55
да ладо писать, это же ЧИТАТЬ придется

Index
01.02.2018
21:49:22
Так читать-то такое явно приятнее, сразу видно какой параметр что означает
К тому же здесь так сказать first-class эти аргументы, так что если их пробрасывать глубже по коллстэку, то имена писать не нужно

A64m
01.02.2018
21:50:38
для этого можно рекорды применять, у них хоть синтаксис нормальный, а это похоже на кофескрипт какой-то, прости г-ди

Google

Index
01.02.2018
21:51:16
ну и как ты рекорды применишь, без объявления рекорда на каждую функцию?
И еще конструктор рекорда писать

A64m
01.02.2018
21:51:30
с объявлением, конечно

Index
01.02.2018
21:51:52
Text.replace Text.ReplaceArguments
{ haystack = path
, needle = "$HOME"
, replacement = "/home/username"
}
вот лучше-то стало
Сразу душенька радуется, скобки фигурные, запятые, всё как у людей.

A64m
01.02.2018
21:52:15
да, лучше

Index
01.02.2018
21:55:39
я бы еще купился на этот аргумент в языке в first class records

A64m
01.02.2018
21:56:01
не для реплейса конечно, для него было бы лучше replace ("/home/username" <$ "$HOME")
да, лучше бы было анонимные рекорды тогда уж делать, а не костыли для убогого некомпозабельного апи

Index
01.02.2018
21:57:41
А здесь, например, частью мотивации было заменить Bool-флаги, которые в некоторые функции у нас передаются, имена им вот дать. Я говорю, мол, в ньютайпы всё обернуть, но понимаю, что ни у кого кроме меня на это терпения не хватит, там ведь нужно объявления писать, экспорты
Ну следующий шаг понятен, надо человеческие ньютайпы заменить на эти гадские OverloadedLabels с Symbol, заменил.
А раз это сделано, то порядок сделать произвольным это просто небольшое улучшение, в принципе оно не обязательное, но мне нравится.

Google

A64m
01.02.2018
21:58:59
а уж никаких функций с параметрами типа Bool (кроме bool) и вовсе быть не должно

Index
01.02.2018
21:59:24
Как ты флаги будешь передавать?
В ньютайп Bool обернуть, или сделать data IsFlag = YesFlag | NoFlag
Но этого делать никто, конечно, не будет, я уже сказал.

A64m
01.02.2018
22:00:25
так тоже никто не будет писать

Index
01.02.2018
22:00:46
Потому что это во-первых неймспейс заполняет, во-вторых требует топ-левельных деклараций, в-третьих экспортов
так тоже никто не будет писать
ну с этим я спорить не буду пока что, еще неизвестно, но вообще идея не исключительно моя, я это просто заимплементил, там предлагалось что-то строго хуже для этого, в итоге всем пока что понравилось
ну и "фу-у-у кофескрипт" основывается на неприязни к кофескрипту, которая вообще-то не у всех

Artyom
01.02.2018
22:05:16
ага, тут либу нашу диссят

Index
01.02.2018
22:06:54
не щад но

Artyom
01.02.2018
22:09:05
да хотя нет, вроде не особо и диссят ?

Imants
01.02.2018
22:09:31
А разве нельзя минус оверрайднуть для типов библиотеки только?
Переписать нельзя и нет надобности.
Но в своём модуле можно определить оператор, похожий на оператор, определённый в других модулях.
При использовании нового оператора достаточно указать alias qualified, и всё - прилично.
По-моему, лучше так, чем операторы в 3+ символа

Index
01.02.2018
22:11:42

Denis
01.02.2018
22:12:02

A64m
01.02.2018
22:14:43
можно же еще let ?needle = "$HOME"; ?replacement = "/home/username" in replace path

Index
01.02.2018
22:16:33
А ну да, лучшее расширение Хаскеля

A64m
01.02.2018
22:16:55
получше лейблов-то
хоть не мотивирует всех адовые сиротские инстансы писать

Index
01.02.2018
22:17:34
ну нет, мне лейблы не нравятся потому что Symbol, а здесь тоже Symbol, только еще shadowing-семантика убийственная

Google

A64m
01.02.2018
22:18:40
но большинство фокусов для которых они предназначены без сирот если и сделать, то так, что непонятно становится, за что боролись
ах да, тут как раз такой случай

Index
01.02.2018
22:20:01
Ну как подвезут анонимные рекорды, так можно будет говорить о чем-то
А пока что их не то что никто не заимплементил, никто и proposal не написал толком.

A64m
01.02.2018
22:21:15
пропозал можно взять из кладбища пропозалов
когда рекорды обсуждали несколько лет назад, там этих пропозалов понаписали
не могу сказать, на любой вкус, конечно, потому что буквально, ни одного нормального так и не придумали
по крайней мере каждый надет себе там такой, который сможет ненавидеть

Index
01.02.2018
22:23:57
Но уж получше чем убогое некомпозабельное API с keyword arguments, небось
Что его делает некомпозабельным, кстати?

A64m
01.02.2018
22:25:05
ну вроде понятно из примера композабельного, где иголка это парсер, парсящий соотв. слово

Index
01.02.2018
22:26:12
а, ну понятно, это про API библиотеки комментарий, а не про keyword arguments

A64m
01.02.2018
22:26:56
да и имплициты лучше чем эти кейворд-аргументы, хоть синтаксис обычный хаскельный будет
но в каждой второй хаскельной библиотеке для этого именно рекорды используются, подход отстойный, но хоть привычный

Index
01.02.2018
22:29:27

A64m
01.02.2018
22:30:38
да, больше. Это даже больше чем анонимные рекорды, которые из них можно сделать

Index
01.02.2018
22:31:46
Какие еще анонимные рекорды на имплицитах?

A64m
01.02.2018
22:33:33
{-# LANGUAGE ImplicitParams, ConstraintKinds, GADTs, RankNTypes #-}
module Main where
— начинается имплементация рекордов
data Rec fields where
Rec :: fields => Rec fields
infixr 1 ?
(?) :: Rec fields -> (fields => r) -> r
Rec ? e = e
— готово
type RXY = Rec (?x::Int, ?y::Int)
xy, xy' :: RXY
xy = let ?x = 1; ?y = 2 in Rec
xy' = Rec where ?x = 3; ?y = 4
foo :: RXY -> Int
foo r = r ? ?x + ?y
type RZ = Rec (?z::Int)
z :: RZ
z = Rec where ?z = 42
— type RXYZ = (RXY, RZ)
type RXYZ = Rec (?x::Int, ?y::Int, ?z::Int)
xyz :: RXYZ
xyz = xy ? z ? Rec — concatenation
t1 = foo xy
t2 = foo (xyz ? Rec) — subtyping
t3 = foo (xy ? Rec)
main = print $ foo xy

Index
01.02.2018
22:35:16
Эм-м-м, нет.

A64m
01.02.2018
22:35:35
да

Google

Index
01.02.2018
22:36:06
Как я могу принять на вход в функцию два таких рекорда с одинаково именованными полями?
Так я понял, там для этого ?

A64m
01.02.2018
22:36:55
через разные параметры - почему нет? Их просто не сконкатенировать

Index
01.02.2018
22:37:35
Сейчас бы понять, к чему придраться, а то ведь придется пользоваться.

A64m
01.02.2018
22:37:47
при передаче в функцию? Там ? для сабтайпинга
придраться можно для начала к отстойному выводу типов
но для анонимных рекордов это типичная проблема

Index
01.02.2018
22:38:48
Или как еще field access делать?

Admin
ERROR: S client not available

A64m
01.02.2018
22:39:04
да, он многоцелевой
лучше конечно для кадой его функции синоним придумать
но изобретательнаверняка очень гордился именно вот этой универсальностью

Index
01.02.2018
22:42:05
Для пущей универсальности вместо Rec берем Dict

A64m
01.02.2018
22:42:20
да
но надо же show инстанс писать свой, для Dict это проблема будет
но такие рекорды с имплицитами, захвачеными в разные ГАДТ элементарно кастятся один к другому

Index
01.02.2018
22:44:16
Всё, я придумал к чему придираться буду
type RXYZ = Rec (?x::Int, ?y::Int, ?z::Int)
type RYXZ = Rec (?y::Int, ?x::Int, ?z::Int)
Типы разные, хочу одинаковые.

A64m
01.02.2018
22:45:17
я писал тайпфемели, который их по алфавиту сортирует

Google

Index
01.02.2018
22:45:17
Конечно Kmett предлагал, что для Constraint унификация должна быть через bi-implication
Может с QuantifiedConstraints теперь можно что-то придумать будет.

A64m
01.02.2018
22:46:09
но со всеми этими тайплевел наворотами вся прелесть легковесности и безбиблиотечной реализации теряется, конечно

Index
01.02.2018
22:47:37
Мне все еще не нравится, что в данной истории можно написать
foo :: RXY -> RXY -> Int
foo Rec Rec = ?x
и гадать, какой ?x возьмется

Denis
01.02.2018
22:47:41
https://np.reddit.com/r/haskell/comments/7toutl/now_there_is_a_branch_to_play_with/

Index
01.02.2018
22:47:47
Эйзенберг мне не сказал, какая там семантика для этого, когда я его спрашивал про shadowing semantics for implicit parameters

A64m
01.02.2018
22:48:19
там рассахаривание в обычный тайпкласс и тайплевел строчки, можно ни в чем себе не отказывать

Index
01.02.2018
22:49:17
Я понимаю во что оно рассахаривается, но там у GHC особый instance selection
Потому что если попробовать вот Given из reflection запихать, а потом IP, а потом сделать вот как выше foo Rec Rec = ?x, то оно разные выберет (в случае с Given первый, в случае с IP второй)
Это загадочно и стрёмно.
И наверняка от фазы Луны зависит.
Судя по тому, что на IP построен HasCallStack, там для шэдоунга где-то есть логика, но я почитал исходники в GHC и найти ее не смог.
Мне же никто не помешает привнести два словаря для IP из разных GADT-ов

A64m
01.02.2018
22:53:34
не давать пользователю конструктор, чтоб он не мог выпускать их вот так, а все обычные рекордовые операции делать как обычно делают во всяких костыльных рекордах
так останется только синтаксис конструирования рекордов через let/where

Index
01.02.2018
22:54:46
ага, синтаксис мечты
две худшие конструкции Haskell переиспользовать бы

A64m
01.02.2018
22:55:14
ну лучше, чем бывает у самодельных рекордов обычно со всеми этими .=
ну и еще остается плюс, что не надо писать саму имплементацию на велью левел, только на тайплевеле туплы констрейнтов собирать, а остальное работает автомагически

Index
01.02.2018
22:58:53