_root_

_root_ は名前空間のルートを表します.主に名前空間を一時的に抜けるために使います.名前空間 Hoge の中で foo を定義すると Hoge.foo という名前になりますが,_root_.foo と定義すればこの挙動を避けて foo という名前にすることができます.

たとえば以下のように名前空間の中で List 配下の関数を定義し,フィールド記法を使おうとしてもうまくいきません.こういう場合に _root_ を使用すると,名前空間を閉じることなくエラーを解消できます.

namespace Root

variable {α : Type}

def List.unpack (l : List (List α)) : List α :=
  match l with
  | [] => []
  | x :: xs => x ++ unpack xs

/--
error: invalid field 'unpack', the environment does not contain 'List.unpack'
  [[1, 2], [3]]
has type
  List (List Nat)
-/
#check ([[1, 2], [3]] : List (List Nat)).unpack

-- エラーになる原因は,名前空間 `Root` の中で宣言したので
-- 関数名が `Root.List.unpack` になってしまっているから
#check Root.List.unpack

-- `_root_` を頭につけて再度定義する
def _root_.List.unpack (l : List (List α)) : List α :=
  match l with
  | [] => []
  | x :: xs => x ++ unpack xs

-- 今度は成功する
#eval [[1, 2], [3]].unpack

end Root