Как можно обработать В подзапросе с LINQ к SQL?

[Правовая оговорка: Я все еще пытаюсь полностью grok монады. Следующее, что я понял до сих пор. Если it’s неправильно, надо надеяться, кто-то хорошо осведомленный позвонит мне на ковре.]

Arnar записал:

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

That’s точно это. Идея идет как это:

  1. Вы принимаете некоторое значение и обертываете его с некоторой дополнительной информацией. Точно так же, как значение является определенным видом (например, целое число или строка), таким образом, дополнительной информацией является определенный вид.

    , Например, что дополнительная информация могла бы быть Maybe или IO.

  2. Тогда у Вас есть некоторые операторы, которые позволяют Вам воздействовать на обернутые данные при переносе вдоль той дополнительной информации. Эти операторы используют дополнительную информацию, чтобы решить, как изменить поведение операции на обернутом значении.

    , Например, Maybe Int может быть Just Int или Nothing. Теперь, если Вы добавите Maybe Int к Maybe Int, оператор проверит, чтобы видеть, ли они и Just Int с внутри, и если так, развернут Int с, передаст их оператор сложения, повторно обернет получающееся Int в новое Just Int (который является допустимым Maybe Int), и таким образом возвратитесь Maybe Int. Но если один из них был Nothing внутренняя часть, этот оператор просто сразу возвратится Nothing, который снова является допустимым Maybe Int. Тем путем можно притвориться, что Ваш Maybe Int с являются просто нормальными числами и выполняют регулярную математику на них. Если необходимо было добраться Nothing, уравнения все еще приведут к правильному результату †“ без Вас имеющий необходимость замусорить проверки на [1 118] везде .

, Но пример, что происходит для [1 119]. Если дополнительная информация была IO, то тот специальный оператор определил для [1 121], с назовут вместо этого, и это могло сделать что-то полностью различное прежде, чем выполнить дополнение. (Хорошо, добавляя два IO Int с вместе является, вероятно, бессмысленным †“I’m, не уверенный все же.) (Кроме того, если Вы обратили внимание на Maybe пример, Вы заметили, что “wrapping значение с дополнительным stuff” не всегда корректен. Но it’s трудно, чтобы быть точным, корректным и точным, не будучи непостижимым.)

В основном, “monad” примерно означает “pattern” . Но вместо книги, полной неофициально объясненных и специфически именованных Шаблонов, Вы теперь имеете конструкция языка †“синтаксис и весь †“, который позволяет, Вы к [1 148] объявляете новые шаблоны как вещи в Вашей программе . (Неточность вот является всеми шаблонами, должны следовать за конкретной формой, таким образом, монада не совсем так же универсальна как шаблон. Но я думаю that’s самый близкий термин, который большинство людей знает и понимает.)

И именно поэтому люди находят монады настолько сбивающими с толку: потому что они - такое универсальное понятие. Для выяснения, что делает что-то, монада столь же неопределенна для выяснения, что делает что-то шаблоном.

, Но думают о последствиях о наличии синтаксической поддержки на языке для идеи шаблона: вместо того, чтобы иметь необходимость читать Банда Четыре книга и запомнить конструкцию конкретного шаблона, Вы всего код записи, который реализует этот шаблон в агностике, универсальный путь однажды и затем Вы сделаны! Можно тогда снова использовать этот шаблон, как Посетитель или Стратегия или FaГ§ade или что бы то ни было, только путем украшения операций в коде с ним, не имея необходимость повторно реализовывать его много раз!

Так, чтобы был то, почему люди, которые понимают монады, находят их так полезными : it’s не некоторое понятие башни слоновой кости, что интеллектуальные снобы гордость себя на понимании (хорошо, это, слишком конечно, хихикают), но на самом деле делают код более простым.

53
задан Ian Oxley 8 September 2008 в 20:20
поделиться

2 ответа

// сначала создаем словарь / набор / коллекцию

Найти другие артиллерии

var fids = (from fb in FooBar
            where fb.BarID = 1000
            select new { fooID = fb.FooID, barID = fb.BarID })
            .ToDictionary(x => x.fooID, x => x.barID);

from f in Foo
where fids.HasKey(f.FooId)
select f
1
ответ дан 7 November 2019 в 08:22
поделиться

// сначала создаем словарь / набор / сборник

Найти другие артиллерийские установки

var fids = (from fb in FooBar where fb.BarID = 1000 select new { fooID = fb.FooID, barID = fb.BarID }) .ToDictionary(x => x.fooID, x => x.barID);

from f in Foo where fids.HasKey(f.FooId) select f
0
ответ дан 7 November 2019 в 08:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: