Чтобы доказать это, просто начните с одной стороны уравнения и переписывайте, пока не дойдете до другой стороны. Мне нравится начинать с более сложной стороны.
when x :: Int,
Continuant (getUI (Continuant x))
-- ^^^^^^^^^^^^^^^^^^^^
-- by definition of getUI in Category Continuant Int
= Continuant x
Это было легко! Это считается доказательством (обратите внимание, формально не проверено - Haskell недостаточно силен, чтобы выразить доказательства на уровне терминов. Но это настолько тривиально, что в Агде это не стоило бы эталона).
Я был немного озадачен формулировкой этой аксиомы, так как она, кажется, довольно часто смешивает типы и термины. Пролистывая статью, кажется, что она предназначена для работы только с простым одним конструктором newtype
, поэтому это смешение оправдано (все еще странно). В любом случае, похоже, что в статье нет класса Category
, параметризованного на a
: то есть вместо
class Category t a where ...
это будет
class Category t where ...
, что имеет больше смысла для меня то, что класс описывает полиморфные обертки, а не, возможно, другое описание того, как он обертывает каждый отдельный тип (тем более что кажется, что аксиома требует, чтобы реализация была одинаковой независимо от того, что a
вы выберете!). [ 1111]
Вы хотите расширить DropDownList в Пользовательском элементе управления... не в usercontrol.
Создайте новый Проект Библиотеки классов под названием MyLibrary.
Добавьте класс по имени MyDropDownList.cs
namespace My.Namespace.Controls
{
[ToolboxData("<{0}:MyDropDownList runat=\"server\"></{0}:MyDropDownList>")]
public class MyDropDownList: DropDownList
{
// your custom code goes here
// e.g.
protected override void RenderContents(HtmlTextWriter writer)
{
//Your own render code
}
}
}
После того как Вы компилируете свою библиотеку, можно добавить ссылку на нее в веб-приложении.
И tagprefix в Вашем web.config
<add tagPrefix="my" namespace="My.Namespace.Controls" assembly="MyLibrary" />
Это должно позволить Вам добавлять это к своему aspx/ascx's
<my:MyDropDownList ID="myDDl" runat="server">
...
</my:MyDropDownList>
В комментарии Вы разъясняете свою цель: "Единственная вещь, которую я хочу сделать с ним, добавляет свойство InitialValue, которое определяет первое значение, которое всегда присутствует в DDL".
Я не думаю, что необходимо создать управление специального пользователя или пользовательский элемент управления для выполнения этого.
Я часто использую этот код всюду по своим веб-приложениям для заполнения средств управления списком. Вы передаете в булевской переменной, указывающей, должен ли дополнительный ListItem быть добавлен наверху списка и текста для того объекта.
public static void BindListControl (ListControl ctl, SqlDataReader dr,
String textColumn, String valueColumn, bool addBlankRow, string blankRowText)
{
ctl.Items.Clear();
ctl.DataSource = dr;
ctl.DataTextField = textColumn;
ctl.DataValueField = valueColumn;
ctl.DataBind();
if (addBlankRow == true) ctl.Items.Insert(0, blankRowText);
}
Это полезно, например, если Вы хотите, чтобы каждый DropDownList имел как его начальное значение пробел или текст, такой как "Выбор город".