{
  "displayName": "Haskell",
  "fileTypes": [
    "hs",
    "hs-boot",
    "hsig"
  ],
  "name": "haskell",
  "patterns": [
    {
      "include": "#liquid_haskell"
    },
    {
      "include": "#comment_like"
    },
    {
      "include": "#numeric_literals"
    },
    {
      "include": "#string_literal"
    },
    {
      "include": "#char_literal"
    },
    {
      "match": "(?<![#@])-}",
      "name": "invalid"
    },
    {
      "captures": {
        "1": {
          "name": "punctuation.paren.haskell"
        },
        "2": {
          "name": "punctuation.paren.haskell"
        }
      },
      "match": "(\\()\\s*(\\))",
      "name": "constant.language.unit.haskell"
    },
    {
      "captures": {
        "1": {
          "name": "punctuation.paren.haskell"
        },
        "2": {
          "name": "keyword.operator.hash.haskell"
        },
        "3": {
          "name": "keyword.operator.hash.haskell"
        },
        "4": {
          "name": "punctuation.paren.haskell"
        }
      },
      "match": "(\\()(#)\\s*(#)(\\))",
      "name": "constant.language.unit.unboxed.haskell"
    },
    {
      "captures": {
        "1": {
          "name": "punctuation.paren.haskell"
        },
        "2": {
          "name": "punctuation.paren.haskell"
        }
      },
      "match": "(\\()\\s*,[,\\s]*(\\))",
      "name": "support.constant.tuple.haskell"
    },
    {
      "captures": {
        "1": {
          "name": "punctuation.paren.haskell"
        },
        "2": {
          "name": "keyword.operator.hash.haskell"
        },
        "3": {
          "name": "keyword.operator.hash.haskell"
        },
        "4": {
          "name": "punctuation.paren.haskell"
        }
      },
      "match": "(\\()(#)\\s*,[,\\s]*(#)(\\))",
      "name": "support.constant.tuple.unboxed.haskell"
    },
    {
      "captures": {
        "1": {
          "name": "punctuation.bracket.haskell"
        },
        "2": {
          "name": "punctuation.bracket.haskell"
        }
      },
      "match": "(\\[)\\s*(])",
      "name": "constant.language.empty-list.haskell"
    },
    {
      "begin": "(\\b(?<!')(module)|^(signature))\\b((?!'))",
      "beginCaptures": {
        "2": {
          "name": "keyword.other.module.haskell"
        },
        "3": {
          "name": "keyword.other.signature.haskell"
        }
      },
      "end": "(?=\\b(?<!')where\\b(?!'))",
      "name": "meta.declaration.module.haskell",
      "patterns": [
        {
          "include": "#comment_like"
        },
        {
          "include": "#module_name"
        },
        {
          "include": "#module_exports"
        },
        {
          "match": "[a-z]+",
          "name": "invalid"
        }
      ]
    },
    {
      "include": "#ffi"
    },
    {
      "begin": "^(\\s*)(class)\\b((?!'))",
      "beginCaptures": {
        "2": {
          "name": "keyword.other.class.haskell"
        }
      },
      "end": "(?=(?<!')\\bwhere\\b(?!'))|(?=[;}])|^(?!\\1\\s+\\S|\\s*(?:$|\\{-[^@]|--+(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]).*$))",
      "name": "meta.declaration.class.haskell",
      "patterns": [
        {
          "include": "#comment_like"
        },
        {
          "include": "#where"
        },
        {
          "include": "#type_signature"
        }
      ]
    },
    {
      "begin": "^(\\s*)(data|newtype)(?:\\s+(instance))?\\s+((?:(?!(?<![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])(?:=|--+)(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])|\\b(?<!')(?:where|deriving)\\b(?!')|\\{-).)*)(?=\\b(?<!'')where\\b(?!''))",
      "beginCaptures": {
        "2": {
          "name": "keyword.other.$2.haskell"
        },
        "3": {
          "name": "keyword.other.instance.haskell"
        },
        "4": {
          "patterns": [
            {
              "include": "#type_signature"
            }
          ]
        }
      },
      "end": "(?=(?<!')\\bderiving\\b(?!'))|(?=[;}])|^(?!\\1\\s+\\S|\\s*(?:$|\\{-[^@]|--+(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]).*$))",
      "name": "meta.declaration.$2.generalized.haskell",
      "patterns": [
        {
          "include": "#comment_like"
        },
        {
          "begin": "(?<!')\\b(where)\\s*(\\{)(?!-)",
          "beginCaptures": {
            "1": {
              "name": "keyword.other.where.haskell"
            },
            "2": {
              "name": "punctuation.brace.haskell"
            }
          },
          "end": "(})",
          "endCaptures": {
            "1": {
              "name": "punctuation.brace.haskell"
            }
          },
          "patterns": [
            {
              "include": "#comment_like"
            },
            {
              "include": "#gadt_constructor"
            },
            {
              "match": ";",
              "name": "punctuation.semicolon.haskell"
            }
          ]
        },
        {
          "match": "\\b(?<!')(where)\\b(?!')",
          "name": "keyword.other.where.haskell"
        },
        {
          "include": "#deriving"
        },
        {
          "include": "#gadt_constructor"
        }
      ]
    },
    {
      "include": "#role_annotation"
    },
    {
      "begin": "^(\\s*)(pattern)\\s+(.*?)\\s+(::|∷)(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])",
      "beginCaptures": {
        "2": {
          "name": "keyword.other.pattern.haskell"
        },
        "3": {
          "patterns": [
            {
              "include": "#comma"
            },
            {
              "include": "#data_constructor"
            }
          ]
        },
        "4": {
          "name": "keyword.operator.double-colon.haskell"
        }
      },
      "end": "(?=[;}])|^(?!\\1\\s+\\S|\\s*(?:$|\\{-[^@]|--+(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]).*$))",
      "name": "meta.declaration.pattern.type.haskell",
      "patterns": [
        {
          "include": "#type_signature"
        }
      ]
    },
    {
      "begin": "^\\s*(pattern)\\b(?!')",
      "captures": {
        "1": {
          "name": "keyword.other.pattern.haskell"
        }
      },
      "end": "(?=[;}])|^(?!\\1\\s+\\S|\\s*(?:$|\\{-[^@]|--+(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]).*$))",
      "name": "meta.declaration.pattern.haskell",
      "patterns": [
        {
          "include": "$self"
        }
      ]
    },
    {
      "begin": "^(\\s*)(data|newtype)(?:\\s+(family|instance))?\\s+(((?!(?<![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])(?:=|--+)(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])|\\b(?<!')(?:where|deriving)\\b(?!')|\\{-).)*)",
      "beginCaptures": {
        "2": {
          "name": "keyword.other.$2.haskell"
        },
        "3": {
          "name": "keyword.other.$3.haskell"
        },
        "4": {
          "patterns": [
            {
              "include": "#type_signature"
            }
          ]
        }
      },
      "end": "(?=[;}])|^(?!\\1\\s+\\S|\\s*(?:$|\\{-[^@]|--+(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]).*$))",
      "name": "meta.declaration.$2.algebraic.haskell",
      "patterns": [
        {
          "include": "#comment_like"
        },
        {
          "include": "#deriving"
        },
        {
          "include": "#forall"
        },
        {
          "include": "#adt_constructor"
        },
        {
          "include": "#context"
        },
        {
          "include": "#record_decl"
        },
        {
          "include": "#type_signature"
        }
      ]
    },
    {
      "begin": "^(\\s*)(type)\\s+(family)\\b(?!')(((?!(?<![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])(?:=|--+)(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])|\\b(?<!')where\\b(?!')|\\{-).)*)",
      "beginCaptures": {
        "2": {
          "name": "keyword.other.type.haskell"
        },
        "3": {
          "name": "keyword.other.family.haskell"
        },
        "4": {
          "patterns": [
            {
              "include": "#comment_like"
            },
            {
              "include": "#where"
            },
            {
              "include": "#type_signature"
            }
          ]
        }
      },
      "end": "(?=[;}])|^(?!\\1\\s+\\S|\\s*(?:$|\\{-[^@]|--+(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]).*$))",
      "name": "meta.declaration.type.family.haskell",
      "patterns": [
        {
          "include": "#comment_like"
        },
        {
          "include": "#where"
        },
        {
          "include": "#type_signature"
        }
      ]
    },
    {
      "begin": "^(\\s*)(type)(?:\\s+(instance))?\\s+(((?!(?<![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])(?:=|--+|::|∷)(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])|\\{-).)*)",
      "beginCaptures": {
        "2": {
          "name": "keyword.other.type.haskell"
        },
        "3": {
          "name": "keyword.other.instance.haskell"
        },
        "4": {
          "patterns": [
            {
              "include": "#type_signature"
            }
          ]
        }
      },
      "end": "(?=[;}])|^(?!\\1\\s+\\S|\\s*(?:$|\\{-[^@]|--+(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]).*$))",
      "name": "meta.declaration.type.haskell",
      "patterns": [
        {
          "include": "#type_signature"
        }
      ]
    },
    {
      "begin": "^(\\s*)(instance)\\b((?!'))",
      "beginCaptures": {
        "2": {
          "name": "keyword.other.instance.haskell"
        }
      },
      "end": "(?=\\b(?<!')(where)\\b(?!'))|(?=[;}])|^(?!\\1\\s+\\S|\\s*(?:$|\\{-[^@]|--+(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]).*$))",
      "name": "meta.declaration.instance.haskell",
      "patterns": [
        {
          "include": "#comment_like"
        },
        {
          "include": "#where"
        },
        {
          "include": "#type_signature"
        }
      ]
    },
    {
      "begin": "^(\\s*)(import)\\b((?!'))",
      "beginCaptures": {
        "2": {
          "name": "keyword.other.import.haskell"
        }
      },
      "end": "(?=\\b(?<!')(where)\\b(?!'))|(?=[;}])|^(?!\\1\\s+\\S|\\s*(?:$|\\{-[^@]|--+(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]).*$))",
      "name": "meta.import.haskell",
      "patterns": [
        {
          "include": "#comment_like"
        },
        {
          "include": "#where"
        },
        {
          "captures": {
            "1": {
              "name": "keyword.other.$1.haskell"
            }
          },
          "match": "(qualified|as|hiding)"
        },
        {
          "include": "#module_name"
        },
        {
          "include": "#module_exports"
        }
      ]
    },
    {
      "include": "#deriving"
    },
    {
      "include": "#layout_herald"
    },
    {
      "include": "#keyword"
    },
    {
      "captures": {
        "1": {
          "name": "keyword.other.$1.haskell"
        },
        "2": {
          "patterns": [
            {
              "include": "#comment_like"
            },
            {
              "include": "#integer_literals"
            },
            {
              "include": "#infix_op"
            }
          ]
        }
      },
      "match": "^\\s*(infix[lr]?)\\s+(.*)",
      "name": "meta.fixity-declaration.haskell"
    },
    {
      "include": "#overloaded_label"
    },
    {
      "include": "#type_application"
    },
    {
      "include": "#reserved_symbol"
    },
    {
      "include": "#fun_decl"
    },
    {
      "include": "#qualifier"
    },
    {
      "include": "#data_constructor"
    },
    {
      "include": "#start_type_signature"
    },
    {
      "include": "#prefix_op"
    },
    {
      "include": "#infix_op"
    },
    {
      "begin": "(\\()(#)\\s",
      "beginCaptures": {
        "1": {
          "name": "punctuation.paren.haskell"
        },
        "2": {
          "name": "keyword.operator.hash.haskell"
        }
      },
      "end": "(#)(\\))",
      "endCaptures": {
        "1": {
          "name": "keyword.operator.hash.haskell"
        },
        "2": {
          "name": "punctuation.paren.haskell"
        }
      },
      "patterns": [
        {
          "include": "#comma"
        },
        {
          "include": "$self"
        }
      ]
    },
    {
      "begin": "(\\()",
      "beginCaptures": {
        "1": {
          "name": "punctuation.paren.haskell"
        }
      },
      "end": "(\\))",
      "endCaptures": {
        "1": {
          "name": "punctuation.paren.haskell"
        }
      },
      "patterns": [
        {
          "include": "#comma"
        },
        {
          "include": "$self"
        }
      ]
    },
    {
      "include": "#quasi_quote"
    },
    {
      "begin": "(\\[)",
      "beginCaptures": {
        "1": {
          "name": "punctuation.bracket.haskell"
        }
      },
      "end": "(])",
      "endCaptures": {
        "1": {
          "name": "punctuation.bracket.haskell"
        }
      },
      "patterns": [
        {
          "include": "#comma"
        },
        {
          "include": "$self"
        }
      ]
    },
    {
      "include": "#record"
    }
  ],
  "repository": {
    "adt_constructor": {
      "patterns": [
        {
          "include": "#comment_like"
        },
        {
          "begin": "(?<![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])(?:(=)|(\\|))(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])",
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.eq.haskell"
            },
            "2": {
              "name": "keyword.operator.pipe.haskell"
            }
          },
          "end": "(?:\\G|^)\\s*(?:(?<!')\\b(['._\\p{Ll}\\p{Lu}\\p{Lt}\\d]+)|('?(?<paren>\\((?:[^()]?|\\g<paren>)*\\)))|('?(?<brac>\\((?:[^]\\[]?|\\g<brac>)*])))\\s*(?:(?<![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])(:[[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]*)|(`)([\\p{Lu}\\p{Lt}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*)(`))|(?<!')\\b([\\p{Lu}\\p{Lt}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*)|(\\()\\s*(:[[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]*)\\s*(\\))",
          "endCaptures": {
            "1": {
              "patterns": [
                {
                  "include": "#type_signature"
                }
              ]
            },
            "10": {
              "name": "constant.other.haskell"
            },
            "11": {
              "name": "punctuation.paren.haskell"
            },
            "12": {
              "name": "constant.other.operator.haskell"
            },
            "13": {
              "name": "punctuation.paren.haskell"
            },
            "2": {
              "patterns": [
                {
                  "include": "#type_signature"
                }
              ]
            },
            "4": {
              "patterns": [
                {
                  "include": "#type_signature"
                }
              ]
            },
            "6": {
              "name": "constant.other.operator.haskell"
            },
            "7": {
              "name": "punctuation.backtick.haskell"
            },
            "8": {
              "name": "constant.other.haskell"
            },
            "9": {
              "name": "punctuation.backtick.haskell"
            }
          },
          "patterns": [
            {
              "include": "#comment_like"
            },
            {
              "include": "#deriving"
            },
            {
              "include": "#record_decl"
            },
            {
              "include": "#forall"
            },
            {
              "include": "#context"
            }
          ]
        }
      ]
    },
    "block_comment": {
      "applyEndPatternLast": 1,
      "begin": "\\{-",
      "captures": {
        "0": {
          "name": "punctuation.definition.comment.haskell"
        }
      },
      "end": "-}",
      "name": "comment.block.haskell",
      "patterns": [
        {
          "include": "#block_comment"
        }
      ]
    },
    "char_literal": {
      "captures": {
        "1": {
          "name": "punctuation.definition.string.begin.haskell"
        },
        "2": {
          "name": "constant.character.escape.haskell"
        },
        "3": {
          "name": "constant.character.escape.octal.haskell"
        },
        "4": {
          "name": "constant.character.escape.hexadecimal.haskell"
        },
        "5": {
          "name": "constant.character.escape.control.haskell"
        },
        "6": {
          "name": "punctuation.definition.string.end.haskell"
        }
      },
      "match": "(?<!['_\\p{Ll}\\p{Lu}\\p{Lt}\\d])(')(?:[ -\\[\\]-~]|(\\\\(?:NUL|SOH|STX|ETX|EOT|ENQ|ACK|BEL|BS|HT|LF|VT|FF|CR|SO|SI|DLE|DC1|DC2|DC3|DC4|NAK|SYN|ETB|CAN|EM|SUB|ESC|FS|GS|RS|US|SP|DEL|[\"\\&'\\\\abfnrtv]))|(\\\\o[0-7]+)|(\\\\x\\h+)|(\\\\\\^[@-_]))(')",
      "name": "string.quoted.single.haskell"
    },
    "comma": {
      "match": ",",
      "name": "punctuation.separator.comma.haskell"
    },
    "comment_like": {
      "patterns": [
        {
          "include": "#cpp"
        },
        {
          "include": "#pragma"
        },
        {
          "include": "#comments"
        }
      ]
    },
    "comments": {
      "patterns": [
        {
          "begin": "^(\\s*)(--\\s[$|])",
          "beginCaptures": {
            "2": {
              "name": "punctuation.whitespace.comment.leading.haskell"
            }
          },
          "end": "(?=^(?!\\1--+(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])))",
          "name": "comment.block.documentation.haskell"
        },
        {
          "begin": "(^[\\t ]+)?(--\\s[*^])",
          "beginCaptures": {
            "1": {
              "name": "punctuation.whitespace.comment.leading.haskell"
            }
          },
          "end": "\\n",
          "name": "comment.line.documentation.haskell"
        },
        {
          "applyEndPatternLast": 1,
          "begin": "\\{-\\s?[$*^|]",
          "captures": {
            "0": {
              "name": "punctuation.definition.comment.haskell"
            }
          },
          "end": "-}",
          "name": "comment.block.documentation.haskell",
          "patterns": [
            {
              "include": "#block_comment"
            }
          ]
        },
        {
          "begin": "(^[\\t ]+)?(?=--+(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]))",
          "beginCaptures": {
            "1": {
              "name": "punctuation.whitespace.comment.leading.haskell"
            }
          },
          "end": "(?!\\G)",
          "patterns": [
            {
              "begin": "--",
              "beginCaptures": {
                "0": {
                  "name": "punctuation.definition.comment.haskell"
                }
              },
              "end": "\\n",
              "name": "comment.line.double-dash.haskell"
            }
          ]
        },
        {
          "include": "#block_comment"
        }
      ]
    },
    "context": {
      "captures": {
        "1": {
          "patterns": [
            {
              "include": "#comment_like"
            },
            {
              "include": "#type_signature"
            }
          ]
        },
        "2": {
          "name": "keyword.operator.big-arrow.haskell"
        }
      },
      "match": "(.*)(?<![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])(=>|⇒)(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])"
    },
    "cpp": {
      "captures": {
        "1": {
          "name": "punctuation.definition.preprocessor.c"
        }
      },
      "match": "^(#).*$",
      "name": "meta.preprocessor.c"
    },
    "data_constructor": {
      "match": "\\b(?<!')[\\p{Lu}\\p{Lt}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*(?!['.\\w])",
      "name": "constant.other.haskell"
    },
    "deriving": {
      "patterns": [
        {
          "begin": "^(\\s*)(deriving)\\s+(?:(via|stock|newtype|anyclass)\\s+)?",
          "beginCaptures": {
            "2": {
              "name": "keyword.other.deriving.haskell"
            },
            "3": {
              "name": "keyword.other.deriving.strategy.$3.haskell"
            }
          },
          "end": "(?=[;}])|^(?!\\1\\s+\\S|\\s*(?:$|\\{-[^@]|--+(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]).*$))",
          "name": "meta.deriving.haskell",
          "patterns": [
            {
              "include": "#comment_like"
            },
            {
              "match": "(?<!')\\b(instance)\\b(?!')",
              "name": "keyword.other.instance.haskell"
            },
            {
              "captures": {
                "1": {
                  "name": "keyword.other.deriving.strategy.$1.haskell"
                }
              },
              "match": "(?<!')\\b(via|stock|newtype|anyclass)\\b(?!')"
            },
            {
              "include": "#type_signature"
            }
          ]
        },
        {
          "begin": "(deriving)(?:\\s+(stock|newtype|anyclass))?\\s*(\\()",
          "beginCaptures": {
            "1": {
              "name": "keyword.other.deriving.haskell"
            },
            "2": {
              "name": "keyword.other.deriving.strategy.$2.haskell"
            },
            "3": {
              "name": "punctuation.paren.haskell"
            }
          },
          "end": "(\\))",
          "endCaptures": {
            "1": {
              "name": "punctuation.paren.haskell"
            }
          },
          "name": "meta.deriving.haskell",
          "patterns": [
            {
              "include": "#type_signature"
            }
          ]
        },
        {
          "captures": {
            "1": {
              "name": "keyword.other.deriving.haskell"
            },
            "2": {
              "name": "keyword.other.deriving.strategy.$2.haskell"
            },
            "3": {
              "patterns": [
                {
                  "include": "#type_signature"
                }
              ]
            },
            "5": {
              "name": "keyword.other.deriving.strategy.via.haskell"
            },
            "6": {
              "patterns": [
                {
                  "include": "#type_signature"
                }
              ]
            }
          },
          "match": "(deriving)(?:\\s+(stock|newtype|anyclass))?\\s+([\\p{Lu}\\p{Lt}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*)(\\s+(via)\\s+(.*)$)?",
          "name": "meta.deriving.haskell"
        },
        {
          "match": "(?<!')\\b(via)\\b(?!')",
          "name": "keyword.other.deriving.strategy.via.haskell"
        }
      ]
    },
    "double_colon": {
      "captures": {
        "1": {
          "name": "keyword.operator.double-colon.haskell"
        }
      },
      "match": "\\s*(::|∷)(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])\\s*"
    },
    "export_constructs": {
      "patterns": [
        {
          "include": "#comment_like"
        },
        {
          "begin": "\\b(?<!')(pattern)\\b(?!')",
          "beginCaptures": {
            "1": {
              "name": "keyword.other.pattern.haskell"
            }
          },
          "end": "([\\p{Lu}\\p{Lt}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*)|(\\()\\s*(:[[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]+)\\s*(\\))",
          "endCaptures": {
            "1": {
              "name": "constant.other.haskell"
            },
            "2": {
              "name": "punctuation.paren.haskell"
            },
            "3": {
              "name": "constant.other.operator.haskell"
            },
            "4": {
              "name": "punctuation.paren.haskell"
            }
          },
          "patterns": [
            {
              "include": "#comment_like"
            }
          ]
        },
        {
          "begin": "\\b(?<!')(type)\\b(?!')",
          "beginCaptures": {
            "1": {
              "name": "keyword.other.type.haskell"
            }
          },
          "end": "([\\p{Lu}\\p{Lt}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*)|(\\()\\s*([[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]+)\\s*(\\))",
          "endCaptures": {
            "1": {
              "name": "storage.type.haskell"
            },
            "2": {
              "name": "punctuation.paren.haskell"
            },
            "3": {
              "name": "storage.type.operator.haskell"
            },
            "4": {
              "name": "punctuation.paren.haskell"
            }
          },
          "patterns": [
            {
              "include": "#comment_like"
            }
          ]
        },
        {
          "match": "(?<!')\\b[_\\p{Ll}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*",
          "name": "entity.name.function.haskell"
        },
        {
          "match": "(?<!')\\b[\\p{Lu}\\p{Lt}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*",
          "name": "storage.type.haskell"
        },
        {
          "include": "#record_wildcard"
        },
        {
          "include": "#reserved_symbol"
        },
        {
          "include": "#prefix_op"
        }
      ]
    },
    "ffi": {
      "begin": "^(\\s*)(foreign)\\s+((?:im|ex)port)\\s+",
      "beginCaptures": {
        "2": {
          "name": "keyword.other.foreign.haskell"
        },
        "3": {
          "name": "keyword.other.$3.haskell"
        }
      },
      "end": "(?=[;}])|^(?!\\1\\s+\\S|\\s*(?:$|\\{-[^@]|--+(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]).*$))",
      "name": "meta.$3.foreign.haskell",
      "patterns": [
        {
          "include": "#comment_like"
        },
        {
          "captures": {
            "1": {
              "name": "keyword.other.calling-convention.$1.haskell"
            }
          },
          "match": "\\b(?<!')(ccall|cplusplus|dotnet|jvm|stdcall|prim|capi)\\s+"
        },
        {
          "begin": "(?=\")|(?=\\b(?<!')([_\\p{Ll}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*)\\b(?!'))",
          "end": "(?=(::|∷)(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]))",
          "patterns": [
            {
              "include": "#comment_like"
            },
            {
              "captures": {
                "1": {
                  "name": "keyword.other.safety.$1.haskell"
                },
                "2": {
                  "name": "entity.name.foreign.haskell",
                  "patterns": [
                    {
                      "include": "#string_literal"
                    }
                  ]
                },
                "3": {
                  "name": "entity.name.function.haskell"
                },
                "4": {
                  "name": "entity.name.function.infix.haskell"
                }
              },
              "match": "\\b(?<!')(safe|unsafe|interruptible)\\b(?!')\\s*(\"(?:\\\\\"|[^\"])*\")?\\s*(?:\\b(?<!'')([_\\p{Ll}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*)\\b(?!')|\\(\\s*(?!--+\\))([[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]+)\\s*\\))"
            },
            {
              "captures": {
                "1": {
                  "name": "keyword.other.safety.$1.haskell"
                },
                "2": {
                  "name": "entity.name.foreign.haskell",
                  "patterns": [
                    {
                      "include": "#string_literal"
                    }
                  ]
                }
              },
              "match": "\\b(?<!')(safe|unsafe|interruptible)\\b(?!')\\s*(\"(?:\\\\\"|[^\"])*\")?\\s*$"
            },
            {
              "captures": {
                "0": {
                  "name": "entity.name.foreign.haskell",
                  "patterns": [
                    {
                      "include": "#string_literal"
                    }
                  ]
                }
              },
              "match": "\"(?:\\\\\"|[^\"])*\""
            },
            {
              "captures": {
                "1": {
                  "name": "entity.name.function.haskell"
                },
                "2": {
                  "name": "punctuation.paren.haskell"
                },
                "3": {
                  "name": "entity.name.function.infix.haskell"
                },
                "4": {
                  "name": "punctuation.paren.haskell"
                }
              },
              "match": "\\b(?<!'')([_\\p{Ll}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*)\\b(?!')|(\\()\\s*(?!--+\\))([[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]+)\\s*(\\))"
            }
          ]
        },
        {
          "include": "#double_colon"
        },
        {
          "include": "#type_signature"
        }
      ]
    },
    "float_literals": {
      "captures": {
        "1": {
          "name": "constant.numeric.floating.decimal.haskell"
        },
        "2": {
          "name": "constant.numeric.floating.hexadecimal.haskell"
        }
      },
      "match": "\\b(?<!')(?:([0-9][0-9_]*\\.[0-9][0-9_]*(?:[Ee][-+]?[0-9][0-9_]*)?|[0-9][0-9_]*[Ee][-+]?[0-9][0-9_]*)|(0(?:[Xx]_*\\h[_\\h]*\\.\\h[_\\h]*(?:[Pp][-+]?[0-9][0-9_]*)?|[Xx]_*\\h[_\\h]*[Pp][-+]?[0-9][0-9_]*)))\\b(?!')"
    },
    "forall": {
      "begin": "\\b(?<!')(forall|∀)\\b(?!')",
      "beginCaptures": {
        "1": {
          "name": "keyword.other.forall.haskell"
        }
      },
      "end": "(\\.)|(->|→)",
      "endCaptures": {
        "1": {
          "name": "keyword.operator.period.haskell"
        },
        "2": {
          "name": "keyword.operator.arrow.haskell"
        }
      },
      "patterns": [
        {
          "include": "#comment_like"
        },
        {
          "include": "#type_variable"
        },
        {
          "include": "#type_signature"
        }
      ]
    },
    "fun_decl": {
      "begin": "^(\\s*)(?<fn>(?:[_\\p{Ll}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*#*|\\(\\s*(?!--+\\))[[\\p{S}\\p{P}]&&[^]\"'(),:;\\[_`{}]][[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]*\\s*\\))(?:\\s*,\\s*\\g<fn>)?)\\s*(?<![[\\p{S}\\p{P}]&&[^]\"'),;_`}]])(::|∷)(?![[\\p{S}\\p{P}]&&[^\"'(,;\\[_`{]])",
      "beginCaptures": {
        "2": {
          "name": "entity.name.function.haskell",
          "patterns": [
            {
              "include": "#reserved_symbol"
            },
            {
              "include": "#prefix_op"
            }
          ]
        },
        "3": {
          "name": "keyword.operator.double-colon.haskell"
        }
      },
      "end": "(?=(?<![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])((<-|←)|(=)|(-<|↢)|(-<<|⤛))([]\"'(),;\\[_`{}[^\\p{S}\\p{P}]]))|(?=[;}])|^(?!\\1\\s+\\S|\\s*(?:$|\\{-[^@]|--+(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]).*$))",
      "name": "meta.function.type-declaration.haskell",
      "patterns": [
        {
          "include": "#type_signature"
        }
      ]
    },
    "gadt_constructor": {
      "patterns": [
        {
          "begin": "^(\\s*)(?:\\b((?<!')[\\p{Lu}\\p{Lt}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*)|(\\()\\s*(:[[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]*)\\s*(\\)))",
          "beginCaptures": {
            "2": {
              "name": "constant.other.haskell"
            },
            "3": {
              "name": "punctuation.paren.haskell"
            },
            "4": {
              "name": "constant.other.operator.haskell"
            },
            "5": {
              "name": "punctuation.paren.haskell"
            }
          },
          "end": "(?=\\b(?<!'')deriving\\b(?!'))|(?=[;}])|^(?!\\1\\s+\\S|\\s*(?:$|\\{-[^@]|--+(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]).*$))",
          "patterns": [
            {
              "include": "#comment_like"
            },
            {
              "include": "#deriving"
            },
            {
              "include": "#double_colon"
            },
            {
              "include": "#record_decl"
            },
            {
              "include": "#type_signature"
            }
          ]
        },
        {
          "begin": "\\b((?<!')[\\p{Lu}\\p{Lt}][_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*)|(\\()\\s*(:[[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]*)\\s*(\\))",
          "beginCaptures": {
            "1": {
              "name": "constant.other.haskell"
            },
            "2": {
              "name": "punctuation.paren.haskell"
            },
            "3": {
              "name": "constant.other.operator.haskell"
            },
            "4": {
              "name": "punctuation.paren.haskell"
            }
          },
          "end": "$",
          "patterns": [
            {
              "include": "#comment_like"
            },
            {
              "include": "#deriving"
            },
            {
              "include": "#double_colon"
            },
            {
              "include": "#record_decl"
            },
            {
              "include": "#type_signature"
            }
          ]
        }
      ]
    },
    "infix_op": {
      "patterns": [
        {
          "captures": {
            "1": {
              "name": "keyword.operator.promotion.haskell"
            },
            "2": {
              "name": "entity.name.namespace.haskell"
            },
            "3": {
              "name": "keyword.operator.infix.haskell"
            }
          },
          "match": "((?:(?<!'')('')?[\\p{Lu}\\p{Lt}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*\\.)*)(#+|[[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]+(?<!#))"
        },
        {
          "captures": {
            "1": {
              "name": "punctuation.backtick.haskell"
            },
            "2": {
              "name": "entity.name.namespace.haskell"
            },
            "3": {
              "patterns": [
                {
                  "include": "#data_constructor"
                }
              ]
            },
            "4": {
              "name": "punctuation.backtick.haskell"
            }
          },
          "match": "(`)((?:[\\p{Lu}\\p{Lt}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*\\.)*)([_\\p{Ll}\\p{Lu}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*)(`)",
          "name": "keyword.operator.function.infix.haskell"
        }
      ]
    },
    "inline_phase": {
      "begin": "\\[",
      "beginCaptures": {
        "0": {
          "name": "punctuation.bracket.haskell"
        }
      },
      "end": "]",
      "endCaptures": {
        "0": {
          "name": "punctuation.bracket.haskell"
        }
      },
      "name": "meta.inlining-phase.haskell",
      "patterns": [
        {
          "match": "~",
          "name": "punctuation.tilde.haskell"
        },
        {
          "include": "#integer_literals"
        },
        {
          "match": "\\w*",
          "name": "invalid"
        }
      ]
    },
    "integer_literals": {
      "captures": {
        "1": {
          "name": "constant.numeric.integral.decimal.haskell"
        },
        "2": {
          "name": "constant.numeric.integral.hexadecimal.haskell"
        },
        "3": {
          "name": "constant.numeric.integral.octal.haskell"
        },
        "4": {
          "name": "constant.numeric.integral.binary.haskell"
        }
      },
      "match": "\\b(?<!')(?:([0-9][0-9_]*)|(0[Xx]_*\\h[_\\h]*)|(0[Oo]_*[0-7][0-7_]*)|(0[Bb]_*[01][01_]*))\\b(?!')"
    },
    "keyword": {
      "captures": {
        "1": {
          "name": "keyword.other.$1.haskell"
        },
        "2": {
          "name": "keyword.control.$2.haskell"
        }
      },
      "match": "\\b(?<!')(?:(where|let|in|default)|(m?do|if|then|else|case|of|proc|rec))\\b(?!')"
    },
    "layout_herald": {
      "begin": "(?<!')\\b(?:(where|let|m?do)|(of))\\s*(\\{)(?!-)",
      "beginCaptures": {
        "1": {
          "name": "keyword.other.$1.haskell"
        },
        "2": {
          "name": "keyword.control.of.haskell"
        },
        "3": {
          "name": "punctuation.brace.haskell"
        }
      },
      "end": "(})",
      "endCaptures": {
        "1": {
          "name": "punctuation.brace.haskell"
        }
      },
      "patterns": [
        {
          "include": "$self"
        },
        {
          "match": ";",
          "name": "punctuation.semicolon.haskell"
        }
      ]
    },
    "liquid_haskell": {
      "begin": "\\{-@",
      "end": "@-}",
      "name": "block.liquidhaskell.haskell",
      "patterns": [
        {
          "include": "$self"
        }
      ]
    },
    "module_exports": {
      "applyEndPatternLast": 1,
      "begin": "\\(",
      "beginCaptures": {
        "0": {
          "name": "punctuation.paren.haskell"
        }
      },
      "end": "\\)",
      "endCaptures": {
        "0": {
          "name": "punctuation.paren.haskell"
        }
      },
      "name": "meta.declaration.exports.haskell",
      "patterns": [
        {
          "include": "#comment_like"
        },
        {
          "captures": {
            "1": {
              "name": "keyword.other.module.haskell"
            }
          },
          "match": "\\b(?<!')(module)\\b(?!')"
        },
        {
          "include": "#comma"
        },
        {
          "include": "#export_constructs"
        },
        {
          "begin": "\\(",
          "beginCaptures": {
            "0": {
              "name": "punctuation.paren.haskell"
            }
          },
          "end": "\\)",
          "endCaptures": {
            "0": {
              "name": "punctuation.paren.haskell"
            }
          },
          "patterns": [
            {
              "include": "#comment_like"
            },
            {
              "include": "#record_wildcard"
            },
            {
              "include": "#export_constructs"
            },
            {
              "include": "#comma"
            }
          ]
        }
      ]
    },
    "module_name": {
      "match": "(?<conid>[\\p{Lu}\\p{Lt}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*(\\.\\g<conid>)?)",
      "name": "entity.name.namespace.haskell"
    },
    "numeric_literals": {
      "patterns": [
        {
          "include": "#float_literals"
        },
        {
          "include": "#integer_literals"
        }
      ]
    },
    "overloaded_label": {
      "patterns": [
        {
          "captures": {
            "1": {
              "name": "keyword.operator.prefix.hash.haskell"
            },
            "2": {
              "patterns": [
                {
                  "include": "#string_literal"
                }
              ]
            }
          },
          "match": "(?<![[_\\p{Ll}\\p{Lu}\\p{Lt}\\d\\p{S}\\p{P}]&&[^(,;\\[`{]])(#)(?:(\"(?:\\\\\"|[^\"])*\")|['._\\p{Ll}\\p{Lu}\\p{Lt}\\d]+)",
          "name": "entity.name.label.haskell"
        }
      ]
    },
    "pragma": {
      "begin": "\\{-#",
      "end": "#-}",
      "name": "meta.preprocessor.haskell",
      "patterns": [
        {
          "begin": "(?i)\\b(?<!')(LANGUAGE)\\b(?!')",
          "beginCaptures": {
            "1": {
              "name": "keyword.other.preprocessor.pragma.haskell"
            }
          },
          "end": "(?=#-})",
          "patterns": [
            {
              "match": "(?:No)?(?:AutoDeriveTypeable|DatatypeContexts|DoRec|IncoherentInstances|MonadFailDesugaring|MonoPatBinds|NullaryTypeClasses|OverlappingInstances|PatternSignatures|RecordPuns|RelaxedPolyRec)",
              "name": "invalid.deprecated"
            },
            {
              "captures": {
                "1": {
                  "name": "keyword.other.preprocessor.extension.haskell"
                }
              },
              "match": "((?:No)?(?:AllowAmbiguousTypes|AlternativeLayoutRule|AlternativeLayoutRuleTransitional|Arrows|BangPatterns|BinaryLiterals|CApiFFI|CPP|CUSKs|ConstrainedClassMethods|ConstraintKinds|DataKinds|DefaultSignatures|DeriveAnyClass|DeriveDataTypeable|DeriveFoldable|DeriveFunctor|DeriveGeneric|DeriveLift|DeriveTraversable|DerivingStrategies|DerivingVia|DisambiguateRecordFields|DoAndIfThenElse|BlockArguments|DuplicateRecordFields|EmptyCase|EmptyDataDecls|EmptyDataDeriving|ExistentialQuantification|ExplicitForAll|ExplicitNamespaces|ExtendedDefaultRules|FlexibleContexts|FlexibleInstances|ForeignFunctionInterface|FunctionalDependencies|GADTSyntax|GADTs|GHCForeignImportPrim|Generali[sz]edNewtypeDeriving|ImplicitParams|ImplicitPrelude|ImportQualifiedPost|ImpredicativeTypes|TypeFamilyDependencies|InstanceSigs|ApplicativeDo|InterruptibleFFI|JavaScriptFFI|KindSignatures|LambdaCase|LiberalTypeSynonyms|MagicHash|MonadComprehensions|MonoLocalBinds|MonomorphismRestriction|MultiParamTypeClasses|MultiWayIf|NumericUnderscores|NPlusKPatterns|NamedFieldPuns|NamedWildCards|NegativeLiterals|HexFloatLiterals|NondecreasingIndentation|NumDecimals|OverloadedLabels|OverloadedLists|OverloadedStrings|PackageImports|ParallelArrays|ParallelListComp|PartialTypeSignatures|PatternGuards|PatternSynonyms|PolyKinds|PolymorphicComponents|QuantifiedConstraints|PostfixOperators|QuasiQuotes|Rank2Types|RankNTypes|RebindableSyntax|RecordWildCards|RecursiveDo|RelaxedLayout|RoleAnnotations|ScopedTypeVariables|StandaloneDeriving|StarIsType|StaticPointers|Strict|StrictData|TemplateHaskell|TemplateHaskellQuotes|StandaloneKindSignatures|TraditionalRecordSyntax|TransformListComp|TupleSections|TypeApplications|TypeInType|TypeFamilies|TypeOperators|TypeSynonymInstances|UnboxedTuples|UnboxedSums|UndecidableInstances|UndecidableSuperClasses|UnicodeSyntax|UnliftedFFITypes|UnliftedNewtypes|ViewPatterns))"
            },
            {
              "include": "#comma"
            }
          ]
        },
        {
          "begin": "(?i)\\b(?<!')(SPECIALI[SZ]E)(?:\\s*(\\[[^]\\[]*])?\\s*|\\s+)(instance)\\b(?!')",
          "beginCaptures": {
            "1": {
              "name": "keyword.other.preprocessor.pragma.haskell"
            },
            "2": {
              "patterns": [
                {
                  "include": "#inline_phase"
                }
              ]
            },
            "3": {
              "name": "keyword.other.instance.haskell"
            }
          },
          "end": "(?=#-})",
          "patterns": [
            {
              "include": "#type_signature"
            }
          ]
        },
        {
          "begin": "(?i)\\b(?<!')(SPECIALI[SZ]E)\\b(?!')(?:\\s+(INLINE)\\b(?!'))?\\s*(\\[[^]\\[]*])?\\s*",
          "beginCaptures": {
            "1": {
              "name": "keyword.other.preprocessor.pragma.haskell"
            },
            "2": {
              "name": "keyword.other.preprocessor.pragma.haskell"
            },
            "3": {
              "patterns": [
                {
                  "include": "#inline_phase"
                }
              ]
            }
          },
          "end": "(?=#-})",
          "patterns": [
            {
              "include": "$self"
            }
          ]
        },
        {
          "match": "(?i)\\b(?<!')(LANGUAGE|OPTIONS_GHC|INCLUDE|MINIMAL|UNPACK|OVERLAPS|INCOHERENT|NOUNPACK|SOURCE|OVERLAPPING|OVERLAPPABLE|INLINE|NOINLINE|INLINE?ABLE|CONLIKE|LINE|COLUMN|RULES|COMPLETE)\\b(?!')",
          "name": "keyword.other.preprocessor.haskell"
        },
        {
          "begin": "(?i)\\b(DEPRECATED|WARNING)\\b",
          "beginCaptures": {
            "1": {
              "name": "keyword.other.preprocessor.pragma.haskell"
            }
          },
          "end": "(?=#-})",
          "patterns": [
            {
              "include": "#string_literal"
            }
          ]
        }
      ]
    },
    "prefix_op": {
      "patterns": [
        {
          "captures": {
            "1": {
              "name": "punctuation.paren.haskell"
            },
            "2": {
              "name": "entity.name.function.infix.haskell"
            },
            "3": {
              "name": "punctuation.paren.haskell"
            }
          },
          "match": "(\\()\\s*(?!(?:--+|\\.\\.)\\))(#+|[[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]+(?<!#))\\s*(\\))"
        }
      ]
    },
    "qualifier": {
      "match": "\\b(?<!')[\\p{Lu}\\p{Lt}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*\\.",
      "name": "entity.name.namespace.haskell"
    },
    "quasi_quote": {
      "patterns": [
        {
          "begin": "(\\[)([dep])?(\\|\\|?)",
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.quasi-quotation.begin.haskell"
            },
            "2": {
              "name": "entity.name.quasi-quoter.haskell"
            },
            "3": {
              "name": "keyword.operator.quasi-quotation.begin.haskell"
            }
          },
          "end": "\\3]",
          "endCaptures": {
            "0": {
              "name": "keyword.operator.quasi-quotation.end.haskell"
            }
          },
          "name": "meta.quasi-quotation.haskell",
          "patterns": [
            {
              "include": "$self"
            }
          ]
        },
        {
          "begin": "(\\[)(t)(\\|\\|?)",
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.quasi-quotation.begin.haskell"
            },
            "2": {
              "name": "entity.name.quasi-quoter.haskell"
            },
            "3": {
              "name": "keyword.operator.quasi-quotation.begin.haskell"
            }
          },
          "end": "\\3]",
          "endCaptures": {
            "0": {
              "name": "keyword.operator.quasi-quotation.end.haskell"
            }
          },
          "name": "meta.quasi-quotation.haskell",
          "patterns": [
            {
              "include": "#type_signature"
            }
          ]
        },
        {
          "begin": "(\\[)(?:(\\$\\$)|(\\$))?(['._[^\\s\\p{S}\\p{P}]]*)(\\|\\|?)",
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.quasi-quotation.begin.haskell"
            },
            "2": {
              "name": "keyword.operator.prefix.double-dollar.haskell"
            },
            "3": {
              "name": "keyword.operator.prefix.dollar.haskell"
            },
            "4": {
              "name": "entity.name.quasi-quoter.haskell",
              "patterns": [
                {
                  "include": "#qualifier"
                }
              ]
            },
            "5": {
              "name": "keyword.operator.quasi-quotation.begin.haskell"
            }
          },
          "end": "\\5]",
          "endCaptures": {
            "0": {
              "name": "keyword.operator.quasi-quotation.end.haskell"
            }
          },
          "name": "meta.quasi-quotation.haskell"
        }
      ]
    },
    "record": {
      "begin": "(\\{)(?!-)",
      "beginCaptures": {
        "1": {
          "name": "punctuation.brace.haskell"
        }
      },
      "end": "(?<!-)(})",
      "endCaptures": {
        "1": {
          "name": "punctuation.brace.haskell"
        }
      },
      "name": "meta.record.haskell",
      "patterns": [
        {
          "include": "#comment_like"
        },
        {
          "include": "#record_field"
        }
      ]
    },
    "record_decl": {
      "begin": "(\\{)(?!-)",
      "beginCaptures": {
        "1": {
          "name": "punctuation.brace.haskell"
        }
      },
      "end": "(?<!-)(})",
      "endCaptures": {
        "1": {
          "name": "punctuation.brace.haskell"
        }
      },
      "name": "meta.record.definition.haskell",
      "patterns": [
        {
          "include": "#comment_like"
        },
        {
          "include": "#record_decl_field"
        }
      ]
    },
    "record_decl_field": {
      "begin": "([_\\p{Ll}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*)|(\\()\\s*([[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]+)\\s*(\\))",
      "beginCaptures": {
        "1": {
          "name": "variable.other.member.definition.haskell"
        },
        "2": {
          "name": "punctuation.paren.haskell"
        },
        "3": {
          "name": "variable.other.member.definition.haskell"
        },
        "4": {
          "name": "punctuation.paren.haskell"
        }
      },
      "end": "(,)|(?=})",
      "endCaptures": {
        "1": {
          "name": "punctuation.comma.haskell"
        }
      },
      "patterns": [
        {
          "include": "#comment_like"
        },
        {
          "include": "#comma"
        },
        {
          "include": "#double_colon"
        },
        {
          "include": "#type_signature"
        },
        {
          "include": "#record_decl_field"
        }
      ]
    },
    "record_field": {
      "patterns": [
        {
          "begin": "([_\\p{Ll}\\p{Lu}]['._\\p{Ll}\\p{Lu}\\p{Lt}\\d]*)|(\\()\\s*([[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]+)\\s*(\\))",
          "beginCaptures": {
            "1": {
              "name": "variable.other.member.haskell",
              "patterns": [
                {
                  "include": "#qualifier"
                }
              ]
            },
            "2": {
              "name": "punctuation.paren.haskell"
            },
            "3": {
              "name": "variable.other.member.haskell"
            },
            "4": {
              "name": "punctuation.paren.haskell"
            }
          },
          "end": "(,)|(?=})",
          "endCaptures": {
            "1": {
              "name": "punctuation.comma.haskell"
            }
          },
          "patterns": [
            {
              "include": "#comment_like"
            },
            {
              "include": "#comma"
            },
            {
              "include": "$self"
            }
          ]
        },
        {
          "include": "#record_wildcard"
        }
      ]
    },
    "record_wildcard": {
      "captures": {
        "1": {
          "name": "variable.other.member.wildcard.haskell"
        }
      },
      "match": "(?<![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])(\\.\\.)(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])"
    },
    "reserved_symbol": {
      "patterns": [
        {
          "captures": {
            "1": {
              "name": "keyword.operator.double-dot.haskell"
            },
            "10": {
              "name": "keyword.operator.arrow.tail.haskell"
            },
            "11": {
              "name": "keyword.operator.arrow.tail.double.haskell"
            },
            "12": {
              "name": "keyword.other.forall.haskell"
            },
            "2": {
              "name": "keyword.operator.colon.haskell"
            },
            "3": {
              "name": "keyword.operator.eq.haskell"
            },
            "4": {
              "name": "keyword.operator.lambda.haskell"
            },
            "5": {
              "name": "keyword.operator.pipe.haskell"
            },
            "6": {
              "name": "keyword.operator.arrow.left.haskell"
            },
            "7": {
              "name": "keyword.operator.arrow.haskell"
            },
            "8": {
              "name": "keyword.operator.arrow.left.tail.haskell"
            },
            "9": {
              "name": "keyword.operator.arrow.left.tail.double.haskell"
            }
          },
          "match": "(?<![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])(?:(\\.\\.)|(:)|(=)|(\\\\)|(\\|)|(<-|←)|(->|→)|(-<|↢)|(-<<|⤛)|(>-|⤚)|(>>-|⤜)|(∀))(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])"
        },
        {
          "captures": {
            "1": {
              "name": "keyword.operator.postfix.hash.haskell"
            }
          },
          "match": "(?<=[[_\\p{Ll}\\p{Lu}\\p{Lt}\\d\\p{S}\\p{P}]&&[^#,;\\[`{]])(#+)(?![[_\\p{Ll}\\p{Lu}\\p{Lt}\\d\\p{S}\\p{P}]&&[^]),;`}]])"
        },
        {
          "captures": {
            "1": {
              "name": "keyword.operator.infix.tight.at.haskell"
            }
          },
          "match": "(?<=[])_}\\p{Ll}\\p{Lu}\\p{Lt}\\d])(@)(?=[(\\[_{\\p{Ll}\\p{Lu}\\p{Lt}\\d])"
        },
        {
          "captures": {
            "1": {
              "name": "keyword.operator.prefix.tilde.haskell"
            },
            "2": {
              "name": "keyword.operator.prefix.bang.haskell"
            },
            "3": {
              "name": "keyword.operator.prefix.minus.haskell"
            },
            "4": {
              "name": "keyword.operator.prefix.dollar.haskell"
            },
            "5": {
              "name": "keyword.operator.prefix.double-dollar.haskell"
            }
          },
          "match": "(?<![[_\\p{Ll}\\p{Lu}\\p{Lt}\\d\\p{S}\\p{P}]&&[^(,;\\[`{]])(?:(~)|(!)|(-)|(\\$)|(\\$\\$))(?=[(\\[_{\\p{Ll}\\p{Lu}\\p{Lt}\\d])"
        }
      ]
    },
    "role_annotation": {
      "patterns": [
        {
          "begin": "^(\\s*)(type)\\s+(role)\\b(?!')",
          "beginCaptures": {
            "2": {
              "name": "keyword.other.type.haskell"
            },
            "3": {
              "name": "keyword.other.role.haskell"
            }
          },
          "end": "(?=[;}])|^(?!\\1\\s+\\S|\\s*(?:$|\\{-[^@]|--+(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]).*$))",
          "name": "meta.role-annotation.haskell",
          "patterns": [
            {
              "include": "#comment_like"
            },
            {
              "include": "#type_constructor"
            },
            {
              "captures": {
                "1": {
                  "name": "keyword.other.role.$1.haskell"
                }
              },
              "match": "\\b(?<!')(nominal|representational|phantom)\\b(?!')"
            }
          ]
        }
      ]
    },
    "start_type_signature": {
      "patterns": [
        {
          "begin": "^(\\s*)(::|∷)(?![[\\p{S}\\p{P}]&&[^\"'(,;\\[_`{]])\\s*",
          "beginCaptures": {
            "2": {
              "name": "keyword.operator.double-colon.haskell"
            }
          },
          "end": "(?=#?\\)|[],]|(?<!')\\b(in|then|else|of)\\b(?!')|(?<![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])(?:([\\\\λ])|(<-|←)|(=)|(-<|↢)|(-<<|⤛))([]\"'(),;\\[_`{}[^\\p{S}\\p{P}]])|([#@])-}|(?=[;}])|^(?!\\1\\s*\\S|\\s*(?:$|\\{-[^@]|--+(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]).*$)))",
          "name": "meta.type-declaration.haskell",
          "patterns": [
            {
              "include": "#type_signature"
            }
          ]
        },
        {
          "begin": "(?<![[\\p{S}\\p{P}]&&[^\"'(,;\\[_`{]])(::|∷)(?![[\\p{S}\\p{P}]&&[^\"'(,;\\[_`{]])",
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.double-colon.haskell"
            }
          },
          "end": "(?=#?\\)|[],]|\\b(?<!')(in|then|else|of)\\b(?!')|([#@])-}|(?<![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])(?:([\\\\λ])|(<-|←)|(=)|(-<|↢)|(-<<|⤛))([]\"'(),;\\[_`{}[^\\p{S}\\p{P}]])|(?=[;}])|$)",
          "patterns": [
            {
              "include": "#type_signature"
            }
          ]
        }
      ]
    },
    "string_literal": {
      "begin": "\"",
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.string.begin.haskell"
        }
      },
      "end": "\"",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.string.end.haskell"
        }
      },
      "name": "string.quoted.double.haskell",
      "patterns": [
        {
          "match": "\\\\(NUL|SOH|STX|ETX|EOT|ENQ|ACK|BEL|BS|HT|LF|VT|FF|CR|SO|SI|DLE|DC1|DC2|DC3|DC4|NAK|SYN|ETB|CAN|EM|SUB|ESC|FS|GS|RS|US|SP|DEL|[\"\\&'\\\\abfnrtv])",
          "name": "constant.character.escape.haskell"
        },
        {
          "match": "\\\\(?:o[0-7]+|x\\h+|[0-9]+)",
          "name": "constant.character.escape.octal.haskell"
        },
        {
          "match": "\\\\\\^[@-_]",
          "name": "constant.character.escape.control.haskell"
        },
        {
          "begin": "\\\\\\s",
          "beginCaptures": {
            "0": {
              "name": "constant.character.escape.begin.haskell"
            }
          },
          "end": "\\\\",
          "endCaptures": {
            "0": {
              "name": "constant.character.escape.end.haskell"
            }
          },
          "patterns": [
            {
              "match": "\\S+",
              "name": "invalid.illegal.character-not-allowed-here.haskell"
            }
          ]
        }
      ]
    },
    "type_application": {
      "patterns": [
        {
          "begin": "(?<=[]\",;\\[{}\\s])(@)(')?(\\()",
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.prefix.at.haskell"
            },
            "2": {
              "name": "keyword.operator.promotion.haskell"
            },
            "3": {
              "name": "punctuation.paren.haskell"
            }
          },
          "end": "\\)",
          "endCaptures": {
            "0": {
              "name": "punctuation.paren.haskell"
            }
          },
          "name": "meta.type-application.haskell",
          "patterns": [
            {
              "include": "#type_signature"
            }
          ]
        },
        {
          "begin": "(?<=[]\",;\\[{}\\s])(@)(')?(\\[)",
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.prefix.at.haskell"
            },
            "2": {
              "name": "keyword.operator.promotion.haskell"
            },
            "3": {
              "name": "punctuation.bracket.haskell"
            }
          },
          "end": "]",
          "endCaptures": {
            "0": {
              "name": "punctuation.bracket.haskell"
            }
          },
          "name": "meta.type-application.haskell",
          "patterns": [
            {
              "include": "#type_signature"
            }
          ]
        },
        {
          "begin": "(?<=[]\",;\\[{}\\s])(@)(?=\")",
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.prefix.at.haskell"
            }
          },
          "end": "(?<=\")",
          "name": "meta.type-application.haskell",
          "patterns": [
            {
              "include": "#string_literal"
            }
          ]
        },
        {
          "begin": "(?<=[]\",;\\[{}\\s])(@)(?=['_\\p{Ll}\\p{Lu}\\p{Lt}\\d])",
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.prefix.at.haskell"
            }
          },
          "end": "(?!['_\\p{Ll}\\p{Lu}\\p{Lt}\\d])",
          "name": "meta.type-application.haskell",
          "patterns": [
            {
              "include": "#type_signature"
            }
          ]
        }
      ]
    },
    "type_constructor": {
      "patterns": [
        {
          "captures": {
            "1": {
              "name": "keyword.operator.promotion.haskell"
            },
            "2": {
              "name": "entity.name.namespace.haskell"
            },
            "3": {
              "name": "storage.type.haskell"
            }
          },
          "match": "(')?((?:\\b[\\p{Lu}\\p{Lt}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*\\.)*)\\b([\\p{Lu}\\p{Lt}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*)"
        },
        {
          "captures": {
            "1": {
              "name": "keyword.operator.promotion.haskell"
            },
            "2": {
              "name": "punctuation.paren.haskell"
            },
            "3": {
              "name": "entity.name.namespace.haskell"
            },
            "4": {
              "name": "storage.type.operator.haskell"
            },
            "5": {
              "name": "punctuation.paren.haskell"
            }
          },
          "match": "(')?(\\()\\s*((?:[\\p{Lu}\\p{Lt}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*\\.)*)([[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]+)\\s*(\\))"
        }
      ]
    },
    "type_operator": {
      "patterns": [
        {
          "captures": {
            "1": {
              "name": "keyword.operator.promotion.haskell"
            },
            "2": {
              "name": "entity.name.namespace.haskell"
            },
            "3": {
              "name": "storage.type.operator.infix.haskell"
            }
          },
          "match": "(?:(?<!')('))?((?:\\b[\\p{Lu}\\p{Lt}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*\\.)*)(?![#@]?-})(#+|[[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]+(?<!#))"
        },
        {
          "captures": {
            "1": {
              "name": "keyword.operator.promotion.haskell"
            },
            "2": {
              "name": "punctuation.backtick.haskell"
            },
            "3": {
              "name": "entity.name.namespace.haskell"
            },
            "4": {
              "name": "storage.type.infix.haskell"
            },
            "5": {
              "name": "punctuation.backtick.haskell"
            }
          },
          "match": "(')?(`)((?:[\\p{Lu}\\p{Lt}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*\\.)*)([\\p{Lu}\\p{Lt}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*)(`)"
        }
      ]
    },
    "type_signature": {
      "patterns": [
        {
          "include": "#comment_like"
        },
        {
          "captures": {
            "1": {
              "name": "keyword.operator.promotion.haskell"
            },
            "2": {
              "name": "punctuation.paren.haskell"
            },
            "3": {
              "name": "punctuation.paren.haskell"
            }
          },
          "match": "(')?(\\()\\s*(\\))",
          "name": "support.constant.unit.haskell"
        },
        {
          "captures": {
            "1": {
              "name": "punctuation.paren.haskell"
            },
            "2": {
              "name": "keyword.operator.hash.haskell"
            },
            "3": {
              "name": "keyword.operator.hash.haskell"
            },
            "4": {
              "name": "punctuation.paren.haskell"
            }
          },
          "match": "(\\()(#)\\s*(#)(\\))",
          "name": "support.constant.unit.unboxed.haskell"
        },
        {
          "captures": {
            "1": {
              "name": "keyword.operator.promotion.haskell"
            },
            "2": {
              "name": "punctuation.paren.haskell"
            },
            "3": {
              "name": "punctuation.paren.haskell"
            }
          },
          "match": "(')?(\\()\\s*,[,\\s]*(\\))",
          "name": "support.constant.tuple.haskell"
        },
        {
          "captures": {
            "1": {
              "name": "punctuation.paren.haskell"
            },
            "2": {
              "name": "keyword.operator.hash.haskell"
            },
            "3": {
              "name": "keyword.operator.hash.haskell"
            },
            "4": {
              "name": "punctuation.paren.haskell"
            }
          },
          "match": "(\\()(#)\\s*(#)(\\))",
          "name": "support.constant.unit.unboxed.haskell"
        },
        {
          "captures": {
            "1": {
              "name": "punctuation.paren.haskell"
            },
            "2": {
              "name": "keyword.operator.hash.haskell"
            },
            "3": {
              "name": "keyword.operator.hash.haskell"
            },
            "4": {
              "name": "punctuation.paren.haskell"
            }
          },
          "match": "(\\()(#)\\s*,[,\\s]*(#)(\\))",
          "name": "support.constant.tuple.unboxed.haskell"
        },
        {
          "captures": {
            "1": {
              "name": "keyword.operator.promotion.haskell"
            },
            "2": {
              "name": "punctuation.bracket.haskell"
            },
            "3": {
              "name": "punctuation.bracket.haskell"
            }
          },
          "match": "(')?(\\[)\\s*(])",
          "name": "support.constant.empty-list.haskell"
        },
        {
          "include": "#integer_literals"
        },
        {
          "match": "(::|∷)(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])",
          "name": "keyword.operator.double-colon.haskell"
        },
        {
          "include": "#forall"
        },
        {
          "match": "=>|⇒",
          "name": "keyword.operator.big-arrow.haskell"
        },
        {
          "include": "#string_literal"
        },
        {
          "match": "'[^']'",
          "name": "invalid"
        },
        {
          "include": "#type_application"
        },
        {
          "include": "#reserved_symbol"
        },
        {
          "include": "#type_operator"
        },
        {
          "include": "#type_constructor"
        },
        {
          "begin": "(\\()(#)",
          "beginCaptures": {
            "1": {
              "name": "punctuation.paren.haskell"
            },
            "2": {
              "name": "keyword.operator.hash.haskell"
            }
          },
          "end": "(#)(\\))",
          "endCaptures": {
            "1": {
              "name": "keyword.operator.hash.haskell"
            },
            "2": {
              "name": "punctuation.paren.haskell"
            }
          },
          "patterns": [
            {
              "include": "#comma"
            },
            {
              "include": "#type_signature"
            }
          ]
        },
        {
          "begin": "(')?(\\()",
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.promotion.haskell"
            },
            "2": {
              "name": "punctuation.paren.haskell"
            }
          },
          "end": "(\\))",
          "endCaptures": {
            "1": {
              "name": "punctuation.paren.haskell"
            }
          },
          "patterns": [
            {
              "include": "#comma"
            },
            {
              "include": "#type_signature"
            }
          ]
        },
        {
          "begin": "(')?(\\[)",
          "beginCaptures": {
            "1": {
              "name": "keyword.operator.promotion.haskell"
            },
            "2": {
              "name": "punctuation.bracket.haskell"
            }
          },
          "end": "(])",
          "endCaptures": {
            "1": {
              "name": "punctuation.bracket.haskell"
            }
          },
          "patterns": [
            {
              "include": "#comma"
            },
            {
              "include": "#type_signature"
            }
          ]
        },
        {
          "include": "#type_variable"
        }
      ]
    },
    "type_variable": {
      "match": "\\b(?<!')(?!(?:forall|deriving)\\b(?!'))[_\\p{Ll}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*",
      "name": "variable.other.generic-type.haskell"
    },
    "where": {
      "patterns": [
        {
          "begin": "(?<!')\\b(where)\\s*(\\{)(?!-)",
          "beginCaptures": {
            "1": {
              "name": "keyword.other.where.haskell"
            },
            "2": {
              "name": "punctuation.brace.haskell"
            }
          },
          "end": "(})",
          "endCaptures": {
            "1": {
              "name": "punctuation.brace.haskell"
            }
          },
          "patterns": [
            {
              "include": "$self"
            },
            {
              "match": ";",
              "name": "punctuation.semicolon.haskell"
            }
          ]
        },
        {
          "match": "\\b(?<!')(where)\\b(?!')",
          "name": "keyword.other.where.haskell"
        }
      ]
    }
  },
  "scopeName": "source.haskell"
}
