2011年2月9日水曜日

Haskell で Text.Regex の splitRegex 関数を利用しようとするとリンクエラー

Haskell Platform/2010.2.0.0 において、文字列をリストに分割するため、 Text.Regex モジュールの splitRegex を利用しようとしたらエラー。 OS は Windows 7 64bit 。

Prelude> :m Text.Regex
Prelude Text.Regex> splitRegex (mkRegex " ") "hoge piyo fuga"

これを実行すると、

Loading package array-0.3.0.1 ... linking ... done.
Loading package bytestring-0.9.1.7 ... linking ... done.
Loading package containers-0.3.0.0 ... linking ... done.
Loading package syb-0.1.0.2 ... linking ... done.
Loading package base-3.0.3.2 ... linking ... done.
Loading package mtl-1.1.0.2 ... linking ... done.
Loading package regex-base-0.93.2 ... linking ... done.
Loading package regex-posix-0.94.2 ... linking ... : C:\PROGRA~2\HA
SKEL~1\201020~1.0\lib\extralibs\regex-posix-0.94.2\ghc-6.12.3\HSregex-posix-0.94
.2.o: unknown symbol `_regerror'
: unable to load package `regex-posix-0.94.2'

regex-compat on latest Haskell Platform : Programming Haskell Cafe によると、

For what its worth, Regex-posix worked fine with Platform 2009.2.0.2.
I follow GHC releases rather than Platform ones, so I don't know about
later versions.

このバージョンの Haskell が問題のようだ。

 

regex-posix パッケージを最新にする

[haskell-platform] #137: Linking error when using Text.Regex.Posix によると、

'cabal install regex-posix' can solve this problem,

コマンドラインより、

cabal install regex-posix

インストールされたことを確認するために

ghc-pkg list

しかし、依然としてエラーが表示され実行できない。

 

regex-compat パッケージを最新にする

regex-posix に対するパッケージの依存関係を、

ghc-pkg dot | grep "regex-posix"

により調べると、regex-compat モジュールが regex-posix に依存していることがわかる。 ( grep コマンドは Cygwin を利用)

また、Hoogle で検索すると、splitRegex はパッケージ regex-compat にあると表示される。

試しに、

cabal install regex-compat

により regex-compat もインストールしたら splitRegex を使えるようになった。

 

再びモジュールの依存関係を表示させたら、

"regex-compat-0.93.1" -> "regex-posix-0.94.4"
"regex-posix-0.94.4" -> "array-0.3.0.1"
"regex-posix-0.94.4" -> "base-4.2.0.2"
"regex-posix-0.94.4" -> "bytestring-0.9.1.7"
"regex-posix-0.94.4" -> "containers-0.3.0.0"
"regex-posix-0.94.4" -> "regex-base-0.93.2"
"regex-posix-0.94.2" -> "array-0.3.0.1"
"regex-posix-0.94.2" -> "base-4.2.0.2"
"regex-posix-0.94.2" -> "bytestring-0.9.1.7"
"regex-posix-0.94.2" -> "containers-0.3.0.0"
"regex-posix-0.94.2" -> "regex-base-0.93.2"
"regex-compat-0.93.1" -> "regex-posix-0.94.2"
"haskell-platform-2010.2.0.0" -> "regex-posix-0.94.2"

というようにバージョンがごっちゃになってしまったけれど大丈夫かな。。 (@_@;

 

インストールする順序

HackageDB: regex-posix-0.94.4 よりregex-posix をダウンロードし、

runhaskell Setup configure
runhaskell Setup build
runhaskell Setup install

によりインストールしてもダメだった。

  1. regex-posix をインストール
  2. regex-compat をインストール

の順で行なったときだけ動いてくれた。