static procedure language_highlight_haskell (language_structure * language, syntax_structure * syntax) {
	character * separators = ".,:;<=>+-*/%!@#$&~^?|()[]{}'\" \t\r\n";

	character * keywords [] = {
		"case",         "class",        "data",         "deriving",     "do",           "else",         "if",           "import",
		"in",           "infix",        "infixl",       "infixr",       "instance",     "let",          "of",           "module",
		"newtype",      "then",         "type",         "where"
	};

	character * types [] = {
		"Int",          "Integer",      "String",       "Char",         "Float",        "Boolean"
	};

	syntax_define (syntax, false, false, "{-",  "-}", '\0', language->comment_colour,   language->comment_effect);
	syntax_define (syntax, false, false, "--",  "\n", '\0', language->comment_colour,   language->comment_effect);
	syntax_define (syntax, false, false, "'",   "'",  '\\', language->character_colour, language->character_effect);
	syntax_define (syntax, false, false, "\"",  "\"", '\\', language->string_colour,    language->string_effect);

	for (natural_64 word = 0; word < array_length (keywords); ++word) {
		syntax_define (syntax, false, true, keywords [word], separators, '\0', language->keyword_colour, language->keyword_effect);
	}

	for (natural_64 word = 0; word < array_length (types); ++word) {
		syntax_define (syntax, false, true, types [word], separators, '\0', language->type_colour, language->type_effect);
	}

	syntax_define (syntax, true, false, "()[]{}",                "", '\0', language->bracket_colour,  language->bracket_effect);
	syntax_define (syntax, true, false, ".,:;<=>+*-/%!@#$&~^?|", "", '\0', language->operator_colour, language->operator_effect);

	syntax_define (syntax, true, true, language_digits,    separators, '\0', language->number_colour,     language->number_effect);
	syntax_define (syntax, true, true, language_lowercase, separators, '\0', language->lowercase_colour,  language->lowercase_effect);
	syntax_define (syntax, true, true, language_uppercase, separators, '\0', language->uppercase_colour,  language->uppercase_effect);
	syntax_define (syntax, true, true, "_",                separators, '\0', language->underscore_colour, language->underscore_effect);
}