PR

GHCi上でimport文を利用する

 現在のGHCiでは,:moduleコマンドの代わりにimport文を使ってモジュールを使用できるようになっています。特に,Haskell Platform 2011.x.x.xで提供されているGHC 7.0.x以降では,ソースコード上でimport文を利用する場合と同じようにimport文でインポートする構成要素を選んだり,インポートした構成要素をモジュール名で修飾することを強制したり,モジュール名に別名を付けたりできます(参考リンク1参考リンク2)。

Prelude>import Data.Array.Repa as R
Prelude R> rank (Z :. (4::Int))
1
R Prelude> import Prelude hiding (map)
R Prelude> fromListUnboxed (ix3 2 3 4) [1..24]
AUnboxed (((Z :. 2) :. 3) :. 4) (fromList [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0,16.0,17.0,18.0,19.0,20.0,21.0,22.0,23.0,24.0])
R Prelude> computeP $ map (subtract 1) it :: IO (Array U DIM3 Double)
AUnboxed (((Z :. 2) :. 3) :. 4) (fromList [0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0,16.0,17.0,18.0,19.0,20.0,21.0,22.0,23.0])

Prelude> import qualified Data.Array.Repa as R
Prelude R> rank (ix3 2 3 4)

<interactive>:6:1:
    Not in scope: `rank'
    Perhaps you meant `R.rank' (imported from Data.Array.Repa)

<interactive>:6:7:
    Not in scope: `ix3'
    Perhaps you meant one of these:
      `R.ix3' (imported from Data.Array.Repa),
      `R.ix1' (imported from Data.Array.Repa),
      `R.ix2' (imported from Data.Array.Repa)
Prelude R> R.rank (R.ix3 2 3 4)
3
Prelude R> R.fromListUnboxed (R.ix3 2 3 4) ['a'..'x']
AUnboxed (((Z :. 2) :. 3) :. 4) (fromList "abcdefghijklmnopqrstuvwx")
Prelude R> R.computeP $ R.map id it:: IO (R.Array R.U R.DIM3 Char)
AUnboxed (((Z :. 2) :. 3) :. 4) (fromList "abcdefghijklmnopqrstuvwx")

 import文を使えば,モジュール名で完全に修飾しなくても同名の関数の衝突を避けることができるため,ソースコードに近い感覚でGHCiを使えます。GHCi上での関数名の衝突に悩んだときには試してみるとよいでしょう。


著者紹介 shelarcy

 2012年5月23日に,「Learn You a Haskell for Great Good!」の翻訳である「すごいHaskellたのしく学ぼう!」が出版されました。この本はHaskellの入門書ですが,後発の本だけあっていろいろと強みを持っています。例えば,モナドを説明するよりも先にApplicativeを説明するなど,2011年のHaskell事情を反映した説明になっています。また,訳注や付録などを通して,2012年現在のHaskell事情もかなり充実した形で補足されています。すでにHaskellを理解している方も,読んでみれば新たな発見があるでしょう。おすすめです。