8. 弱いモジュール性
モジュール A がモジュール B に依存している場合
モジュール A の実装はモジュール B に依存する
Haskell の既存のモジュールシステム
Haskell の既存のパッケージシステム
は弱いモジュール性で実装されている
(インターフェースの依存性より弱いって意味っぽい)
12. Modules in Today’s Haskell
以下のような Haskell の Modules を考える
-- Socket.hs
module Socket where
data SocketT = ...
open = ...
-- Server.hs
module Server where
import Socket
data ServerT = ... SocketT ...
13. Packages in Backpack'14
Backpack'14 だと次のように書ける
package complete-server where
Socket = [
data SocketT = ...
open = ...
]
Server = [
import Socket
data ServerT = ... SocketT ...
]
この時点では,ただまとめただけ...
※ ココの話はGHCに採用されては無い(構文とか)
14. Packages in Backpack'14
Signature を利用すると次のように書ける
package partial-server where
Socket :: [
data SocketT
open :: Int -> SocketT
]
Server = [
import Socket
data ServerT = ... SocketT ...
]
※ ココの話はGHCに採用されては無い(構文とか)
15. Packages in Backpack'14
packageを別々に定義してincludeすることもできる
package socketsig where
Socket :: [
data SocketT
open :: Int -> SocketT
]
package complete-server where
include socketsig
Server = [
import Socket
data ServerT = ... SocketT ...
]
※ 以降の話はGHCに採用されては無い(構文とか)
16. Packages in Backpack'14
Signature を持つパッケージに,それを実装したパッ
ケージを linking する
package socketimpl where
Socket = [
data SocketT = ...
open = ...
]
package main where
include partial-server
include socketimpl
17. Packages in Backpack'14
再利用する
package server-linked-1 where
include partial-server
include socketimpl-1
package server-linked-2 where
include partial-server
include socketimpl-2
別々の実装 socketimplN を与えて
18. Packages in Backpack'14
再利用する
package multi where
A = { include server-linked-1 }
B = { include server-linked-2 }
Main = [
import qualified A.Server
import qualified B.Server
...
]
両方とも呼び出す!
19. Packages in Backpack'14
再帰的にも適用できちゃう!
package ab-sigs where
A :: [ S_A ]
B :: [ S_B ]
package b-from-a where
include ab-sigs
B = [ inport A ; ... ]
package a-from-b where
include ab-sigs
A = [ inport B ; ... ]
package ab-rec-sep where
include a-form-b
include b-form-a
24. GHC 8.2 で試す
詳しくはこの記事を参照
1. *.bkp というファイルを作る
2. ghc --backpack xxx.bkp と打つだけ
*.bkp は *.hs に比べて unit と言う階層ができた
unit main where
module Main where
main = putStrLn "Hello world!"
ひとつの *.bkp ファイルに unit は複数書いて良い
25. 例: 正規表現
細かい実装は割愛...
-- regex.bkp
unit str-bytestring where
module Str
unit str-string where
module Str
unit regex-types where
module Regex.Types
unit regex-indef where
dependency regex-types
signature Str
module Regex
26. 例: 正規表現
-- regex.bkp
unit main where
dependency regex-types
dependency
regex-indef[Str=str-string:Str]
(Regex as Regex.String)
dependency
regex-indef[Str=str-bytestring:Str]
(Regex as Regex.ByteString)
module Main
ひとつのインターフェースモジュールで別々の実装(
String と ByteString ) が同時に使える!
後は ghc --backpack regex.bkp と打つだけ!