
Работа с памятью (и всё же она есть)
13 min

User
f
, но она была занята для обозначения функтора/переменной типа f
– никакой проблемы с точки зрения языка Haskell в этом нет, но при невнимательном прочтении это может вызвать путаницу, и я использовал для морфизма букву g
. Пустяк, но всё же, я считаю, что полезно визуально разделять сущности, имеющие разную природу. Обычные типы я буду называть их обычными именами, а вот переменные типов я буду называть маленькими греческими буквами, причём простые (∗
) – буквами из начала алфавита, а параметрические (∗ → ∗
) – буквами из конца алфавита (θ
не из конца, но она смотрится лучше, чем χ
, которая слишком похожа на X
). Итак, в терминологии категории Hask: α, β, γ, δ ∷ ∗
θ, φ, ψ, ω ∷ ∗ → ∗
f, g, h ∷ α → β
∗ → ∗
, воплощения класса Functor
. Теперь нужно продумать как устроены единичный морфизм и композиция в этой категории, так чтобы они удовлетворяли аксиомам. class Foo {
static List<Character> abc;
static {
abc = new LinkedList<Character>();
for (char c = 'A'; c <= 'Z'; ++c) {
abc.add( c );
}
}
}
class Bar {
{
System.out.println("Bar: новый экземпляр");
}
}
Map<String, String> map = new HashMap<String, String>() {{
put("паук", "арахнид");
put("птица", "архозавр");
put("кит", "зверь");
}};
JFrame frame = new JFrame() {{
add(new JPanel() {{
add(new JLabel("Хабрахабр?") {{
setBackground(Color.BLACK);
setForeground(Color.WHITE);
}});
add(new JButton("Торт!") {{
addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
System.out.println("Хабрахабр - торт!");
}
});
}});
}});
}};
//медленно
Integer i = new Integer(100);
Long l = new Long(100);
String s = new String("A");
//быстро
Integer i = Integer.valueOf(100);
Long l = 100L;//это тоже самое что Long.valueOf(100L);
String s = "A";