Branch monad, Pattern matching
http://ncatlab.org/nlab/show/coproduct
Монадой не является. В нормальных языках доступен из коробки в виде алгебраических типов. В хаскеле алгебраики - чуть более общая штука, сочетающая сумму и произведение. В окамле это именно сумма, скорее. Твой частный случай для двух типов в хаскеле известен как Either.
спасибо
копроизведениеКакое глубокое, переполненное смыслами слово!
Другое название - гуаноэкстерминация.
В нормальных языках доступен из коробки в виде алгебраических типов.т.е. даже в продвинутых языках на каждый такой случай требуется городить специальный именованный тип? Идеальным был бы синтаксический сахар в стиле Typescript:
void M1(d: DateTime)
{
ToHtml(m1 => m1(d;
}
void M2(s: string)
{
ToHtml(m2 => m2(d;
}
void ToHtml(arg<T>: (m1: DateTime => T, m2: string => T) => T)
{
return Console.WriteLine("<div>" + arg(_ => _.ToString("yyyy-MM-dd" _ => _) + "</div>")
}
Если там пара вариантов, как в твоем примере, то делаешь аргумент например Either Date String и его передаешь. Если вариантов больше, то можно завести новый тип (конкретный или тоже генерик а можно собрать из Either - Either Date (Either String Int).
делаешь аргумент например Either Date String и его передаешь.не удобно, поскольку надо помнить что такое Left что такое Right (типы могу совпасть).
Если вариантов больше, то можно завести новый тип (конкретный или тоже генерик)
анонимные типы тут явно легковеснее смотрятся
а можно собрать из Either - Either Date (Either String Int).
а если в конкретной ветке надо будет передать несколько параметров, таплы будете использовать? а хочется не по номеру позиции, а именованные параметры иметь. Подход Typescript-а прямолинейнее выглядит.
задача то крайне проста: передать параметры (между call и callback-ами)! Решение ее через алгебраические типы, имхо, не самое оптимальное (хотя лучше чем C#/Java).
car :: Either a b -> a
car (Left a) = a
cdr :: Either a b -> b
cdr (Right b) = b
Описать нужный тип - одна строчка. На практике, если в функцию передается "или это или это или это, и их все объединяет способность превращаться в то-то", то часто это оказываются типы одного тайпкласса например. В таком случае явная сумма и не нужна. В других же случаях этот набор типов часто по логике программы уже объединен в какой-то осмысленный тип, вроде узла AST. Совсем уж произвольным вариантам как-то неоткуда взяться.
Откуда ты знаешь, удобно это или нет, если никогда не пробовал?что не пробовал то, объявить variants в Nemerle или discriminated unions в F#? По-моему, очевидно, надо придумывать название типа => неудобно (если нет дополнительных факторов).
... неоткуда взяться.
ну пока нет выразительного средства кажется, что неоткуда взяться. Средство формирует способ мышления, это да.
надо придумывать название типа => неудобнопонятие определяется двумя словами (m1, m2); зачем для него придумывать идентификатор из одного слова?
т.е. тут также как с обычными функциями, если функция принимает 1-5 параметров, тип контейнер можно не вводить. Если параметров много, вводим специальный тип контейнер. Хочет иметь такую же возможность для двойного колбека.
Данный выше не годится - его покрывает тайпкласс Show.
что не пробовал то, объявить variants в Nemerle или discriminated unions в F#?Ну да. Я почему-то был уверен, что однажды ночью к тебе пришел Баллмер и под страхом анальной кары запретил использовать что-либо кроме C#.
Действительно, писать код в форме, которая делает возможной машинную обработку кода, и при этом не иметь софта для такой обработки. Это странно. (Понятно, что есть какие-то инструменты, но до продуктов jetbrains-а они вряд ли дотягивают).
Оставить комментарий
6yrop
По аналогии с Option type хочется вот такое:Как такое называет? И как с этим в разных языках?
Полный код: