importを共通化したい話

Yuji Yamamoto (山本悠滋)

2019-12-11 GHC勉強会

あらまし

「moduleのqualified nameをそのままexportする」とは?

Local modulesの例を超簡略化:

module A ( qualified module M1 ) where


import qualified Import1 as M1

「moduleのqualified nameをそのままexportする」とは?

Local modulesの例を超簡略化:

module B where
import A ( module M1 )
-- あるいは、👇と書くとM1がexportする識別子が M1. なしで使える
import A ( import module M1 )

実現するとできそうなこと(1)

実現するとできそうなこと(1)

Prelude作りがお手軽になると…

議論の流れ

  1. deepfire: Structured module exports/imports #205
  2. ⬇️「more compositional」にしよう
  3. goldfirere: Local modules #283
  4. ⬇️「実はそっくりな拡張を考えてたんだ」
  5. michaelpj: WIP: First class modules #295
  6. Local modules v.s. First class modules ⬅️イマココ!

Local modules v.s. First class modules

どちらも「modulequalified nameをそのままexportする」を一般化して、

moduleの中で入れ子のmoduleを定義」できるようにしている:

Local modules v.s. First class modules

First class modulesの例から:

module A (f, module Unsafe) where

f = Unsafe.g …

module Unsafe where
  g =

Local modules v.s. First class modules

構文が違う(First class modules側の主張から):

Local modules v.s. First class modules

First class modules:

Local modules v.s. First class modules

Local modulesが変えようとしている構文:

  1. Local modules may be exported with this export item:
export_item ::= ... | [ 'qualified' ] 'module' conid [ export_spec ]

Local modules v.s. First class modules

ほかにもLocal modulesは、importmoduleに関して新しい構文を定義している

  1. Local modules may be imported with this import item:
import_item ::= ... | [ 'import' ] 'module' conid [ import_spec ]

実現するとできそうなこと(2)

どちらの提案であれ、moduleの作者がユーザーに、qualified importするのを強制できる

module Data.Set ( Set, qualified module Set ) where

  import module Set ( Set )
  module Set ( Set, fromList ) where
    data Set = ...
    fromList = ...

所感