Haskell Platform 2013.2.0.0 リリース

500 views
Skip to first unread message

shelarcy

unread,
Jun 18, 2013, 9:55:36 AM6/18/13
to haske...@googlegroups.com
こんにちは。

みなさん、もう知っていると思いますが、Haskell Platform 2013.2.0.0 がリリースされています。

http://hackage.haskell.org/platform/
http://projects.haskell.org/pipermail/haskell-platform/2013-May/002605.html

残念ながら、今回 の Haskell Platform のリリースでは、同梱されている Cabal パッケージのバージョンが古い問題は独自に修正されませんでした。

$ ghc-pkg list Cabal
/Library/Frameworks/GHC.framework/Versions/7.6.3-x86_64/usr/lib/ghc-7.6.3/package.conf.d
Cabal-1.16.0
/Users/shelarcy/.ghc/x86_64-darwin-7.6.3/package.conf.d

http://www.haskell.org/platform/changelog.html

cabal コマンド(cabal-install)も、残念ながらこの古い Cabal を使ってビルドしたものになっています。

$ cabal --version
cabal-install version 1.16.0.2
using version 1.16.0 of the Cabal library


最新版の Cabal 1.16.0.3 では、GHC 7.6.3に同梱されている Cabal 1.16 のバグがいくつか修正されています。

http://hackage.haskell.org/package/Cabal-1.16.0.3
http://www.haskell.org/pipermail/libraries/2013-April/019726.html
http://www.haskell.org/pipermail/haskell-cafe/2012-October/103746.html
http://www.haskell.org/pipermail/haskell-cafe/2012-October/104099.html

従って、できれば Haskell Platform インストール後、Cabal のバージョンを上げて、cabal-install を入れ直した方が良いでしょう。

$ cabal update
$ cabal install Cabal-1.16.0.3 cabal-install


* Windows 用のバイナリは 32 bit 版のみ

今回から使われるようになった GHC 7.6.x には Windows 64 bit 版が存在します。

http://www.haskell.org/ghc/download_ghc_7_6_3#windows64

ですが、残念ながら Windows 向けに提供されている Haskell Platform 2013.2.0.0 のバイナリは、今のところ 32 bit 版のみです。Windows 64 bit 版のバイナリはまだ提供されていません。

http://www.haskell.org/platform/windows.html
http://trac.haskell.org/haskell-platform/ticket/209

Windows 64 bit 版が提供されていないのは、おそらく、Haskell Platform で提供されるパッケージの一部と、Windows 版のインストーラーが Windows 64 bit 環境に未対応なためでしょう。

https://github.com/haskell-opengl/OpenGL/issues/28
https://github.com/haskell/network/blob/master/configure.ac#L163

(また、Windows 8 64 bit 版では、Windows 64 bit 版の GHCi の利用に問題があるようです。
http://hackage.haskell.org/trac/ghc/ticket/7134

従って、Windows 64 bit 版のバイナリがどうしても必要な方は、GHC のリリースで提供されているバイナリを利用するしかありません。GHC では 7.6.2 から Windows 版のインストーラーが提供されなくなっているので、このバイナリを使う場合には自分でパスを通す必要があります。


今回のリリースで大きく変わったところは、以下の通りです。


* GHC 7.6.3

GHC が 7.6.3 に更新されました。GHC 7.6.1 の変更点に関しては既に以下のメールで書きましたので、そちらを参考にして下さい。

https://groups.google.com/forum/?fromgroups#!topic/haskell-jp/XqEUSt4CpDY


* cabal-install 1.16.0.2

cabal コマンドが、複数のパッケージの並列インストールに対応しました。cabal install コマンドに -j オプションを渡すことで、指定した数のスレッドを使って、複数のパッケージを並列にインストールすることができます。

http://www.haskell.org/pipermail/haskell-cafe/2012-October/103746.html

$ cabal install --help
Usage: cabal install [FLAGS]
or: cabal install [PACKAGES]

Flags for install:
-h --help Show this help text
(snip)
-j --jobs[=NUM] Run NUM jobs simultaneously.
--haddock-hoogle Generate a hoogle database
(snip)

$ cabal install -j4 repa-examples
(snip)

今回 cabal コマンドが対応したのは、あくまで複数のパッケージを並列にインストールする機能である点に注意してください。make -j のような単一のパッケージを並列にビルドする機能は、まだ提供されていません。従ってパッケージの依存関係によっては、現状の -j オプションでは十分に処理を並列化できず、インストールがあまり速くならない場合もあると思います。

この辺の問題に関しては、将来的には「ghc --make コマンドを並列化、あるいは ghc --make コマンドの代替として使える機能を別途用意する」ことで解決しようと考えているようです。


http://hackage.haskell.org/trac/ghc/ticket/910
http://hackage.haskell.org/package/ghc-parmake
https://github.com/23Skidoo/ghc-parmake#ghc-parmake


* OpenGL 2.8.0.0 と GLUT 2.4.0.0

長らく古いバージョンのままだった OpenGL パッケージと GLUT パッケージが、ようやく新しいバージョンに更新されました。これで gloss などの OpenGL パッケージの新しいバージョンを要求するライブラリを使う場合に、OpenGL パッケージを入れ直す(OpenGL パッケージの新しいバージョンを入れる)必要がなくなりますね。


* attoparsec パッケージ

ByteString 型や Text 型に対して、parsec よりも効率的に処理できるパーサーを提供する attoparsec パッケージが加わりました。

http://hackage.haskell.org/package/attoparsec-0.10.4.0

ただし、attoparsec は parsec と違い、モナド変換子にはなっていません。また attoparsec でのエラー通知は parsec よりも分かり難いという欠点があります。

http://hackage.haskell.org/packages/archive/attoparsec/0.10.4.0/doc/html/Data-Attoparsec-ByteString.html
http://hackage.haskell.org/packages/archive/attoparsec/0.10.4.0/doc/html/Data-Attoparsec-Text.html

従って、(特に parsec や attoparsec のような parsec combinator の利用に慣れていない人は)性能面だけを見て attoparsec を使おうとはせずに、このような欠点があることを念頭に置いた上で parsec と attoparsec のどちらを使うかを総合的に判断した方が良いでしょう。


* hashable パッケージ

様々なデータからハッシュ値を求めるための Hashable クラスを提供するパッケージです。

http://hackage.haskell.org/package/hashable-1.1.2.5


* unordered-containers パッケージ

(Hashable クラスのインスタンスとして定義されている型から求めた)ハッシュ値をキーとして利用するコンテナを提供する unordered-containers パッケージが加わりました。

http://hackage.haskell.org/package/unordered-containers-0.2.3.0

文字列(String、ByteString、Text)などの比較にコストのかかるキーを使う場合、Map 型やSet 型よりも効率的に処理できます。

http://blog.johantibell.com/2011/09/slides-from-my-haskell-implementors.html

(以下の論文は unordered-containers パッケージではなく(実装の異なる) hashmap パッケージのものですが、ネタ元の一つとして参考になると思います。

http://fox.ucw.cz/papers/containers/


* case-insensitive パッケージ

String 型やByteString 型、Text 型などの文字列を、大文字・小文字の区別なしに比較するための機能(CI 型)を提供する、case-insensitive パッケージが加わりました。

http://hackage.haskell.org/package/case-insensitive-1.0.0.1

なお、CI 型は Hashable クラスのインスタンスとして定義されています。

http://hackage.haskell.org/packages/archive/case-insensitive/1.0.0.1/doc/html/src/Data-CaseInsensitive.html#CI

Prelude Data.Hashable Data.CaseInsensitive> :i CI
data CI s
= Data.CaseInsensitive.CI {original :: !s, foldedCase :: !s}
-- Defined in `Data.CaseInsensitive'
instance Eq s => Eq (CI s) -- Defined in `Data.CaseInsensitive'
instance Ord s => Ord (CI s) -- Defined in `Data.CaseInsensitive'
instance (Read s, FoldCase s) => Read (CI s)
-- Defined in `Data.CaseInsensitive'
instance Show s => Show (CI s) -- Defined in `Data.CaseInsensitive'
instance Hashable s => Hashable (CI s)
-- Defined in `Data.CaseInsensitive'
instance FoldCase (CI s) -- Defined in `Data.CaseInsensitive'


--
shelarcy <shelarcy hotmail.co.jp>
http://page.freett.com/shelarcy/

shelarcy

unread,
Jun 22, 2013, 11:54:28 AM6/22/13
to haske...@googlegroups.com
On Tue, 18 Jun 2013 22:55:36 +0900, shelarcy <shel...@gmail.com> wrote:
> みなさん、もう知っていると思いますが、Haskell Platform 2013.2.0.0 がリリースされています。
>
> http://hackage.haskell.org/platform/
> http://projects.haskell.org/pipermail/haskell-platform/2013-May/002605.html


先のメール送信後、stm パッケージについて書き忘れていたのに気がついたので補足のメールを送ります。


* stm 2.4.2

http://hackage.haskell.org/package/stm-2.4.2

** Control.Concurrent.STM.TChan モジュールの変更

*** newBroadcastTChan

複数のチャンネルに対し、メッセージを broadcast(放送,ブロードキャスト)するための newBroadcastTChan 関数が追加されました。

http://hackage.haskell.org/packages/archive/stm/2.4.2/doc/html/Control-Concurrent-STM-TChan.html#v:newBroadcastTChan

newBroadcastTChan 関数では、メッセージの送受信に使うチャンネルを書き込み専用で作成します。そのため、newBroadcastTChan 関数で作成したチャンネルから直接メッセージを受信することはできません。dupTChan 関数を使ってチャンネルを複製し、複製されたチャンネルを使ってメッセージを受信する必要があります。

さてここまでの説明で気がついているかもしれませんが、実はメッセージの broadcast は、newTChan 関数で作成したチャンネルを dupTChan 関数で複製するだけでもできます。ただし、元のチャンネルをメッセージの送信専用(書き込み専用)で利用した場合、送信したデータが GC されずに残ってしまうという問題があります。そこで使用するメモリの肥大化の問題を防ぐため、元のチャンネルを送信専用(書き込み専用)で作成する newBroadcastTChan 関数が追加されたというわけです。


*** cloneTChan

dupTChan とは別に、複製元のチャンネルに入っていたデータを保持してチャンネルを複製する cloneTChan 関数が追加されました。複製元のデータを保持するため、⊥の入っている newBroadcastTChan で作成したチャンネルを直接複製することはできない点に注意してください。

http://hackage.haskell.org/packages/archive/stm/2.4.2/doc/html/src/Control-Concurrent-STM-TChan.html#newBroadcastTChan
http://hackage.haskell.org/packages/archive/stm/2.4.2/doc/html/src/Control-Concurrent-STM-TChan.html#dupTChan


** TQueue 型と TBQueue 型の追加

base パッケージの Control.Concurrent.Chan モジュールで提供されている Chan 型や stm パッケージの Control.Concurrent.STM.TChan モジュールで提供されている TChan 型では、チャンネルの複製が可能なように実装されています。このため、チャンネルの複製を行わない単純な並行処理用のキューとして使うのにはコストが高いという欠点があります、

そこでチャンネルを複製しない場合により高速に使えるキューとして、新しく Control.Concurrent.STM.TQueue モジュールの TQueue 型と Control.Concurrent.STM.TBQueue モジュールの TBQueue が追加されました。

http://www.haskell.org/pipermail/cvs-libraries/2012-June/015680.html
http://hackage.haskell.org/packages/archive/stm/2.4.2/doc/html/Control-Concurrent-STM-TQueue.html
http://hackage.haskell.org/packages/archive/stm/2.4.2/doc/html/Control-Concurrent-STM-TBQueue.html

TBQueue は TQueue の格納できる最大要素数を制限できるバージョンです。


** TSem 型の追加

GHC 7.6.1 で、セマフォを提供する base パッケージの Control.Concurrent.QSem モジュールと Control.Concurrent.QSemN モジュールが非推奨化されました。

http://www.haskell.org/ghc/docs/7.6.3/html/libraries/base-4.6.0.1/Control-Concurrent-QSem.html
http://www.haskell.org/ghc/docs/7.6.3/html/libraries/base-4.6.0.1/Control-Concurrent-QSemN.html

で、Control.Concurrent.QSem モジュールの代わりに利用するセマフォの一つとして、Control.Concurrent.STM.TSem モジュールの TSem 型が追加されました。

http://hackage.haskell.org/packages/archive/stm/2.4.2/doc/html/Control-Concurrent-STM-TSem.html

互換性のためにまだ今のところは base パッケージにセマフォが残っていますが、将来的には削除される予定です。この機に STM 版の TSem 型を試してみると良いかもしれません。

https://github.com/ghc/packages-base/commit/ea3abf16eda97e573ee63fb08ce330d3aeceaeae
http://hackage.haskell.org/trac/ghc/ticket/7417

また、TSem 型が要求に合わない場合には、警告メッセージで例示される SafeSemaphore パッケージを試してみると良いと思います。

http://hackage.haskell.org/package/SafeSemaphore



* text の Builder

ついでに、以前の Haskell Platform や GHC 7.6.1 のリリースでは書き忘れていたことを書いておきます。

GHC 7.6.1 のリリースで bytestring に Builder が加わったと書きましたが、実は text でも Builder が提供されています。

http://hackage.haskell.org/package/text
http://hackage.haskell.org/packages/archive/text/0.11.3.1/doc/html/Data-Text-Lazy-Builder.html

text では Stream Fusion を使った連結処理の融合変換を行いますが、この融合変換ではうまくコードを最適化しきれない場合もあります。そのような場合に、Builder を使って高速化を図ってみると良いでしょう。

http://www.eecs.harvard.edu/~mainland/projects/haskellbeatsc/
http://togetter.com/li/467903


On Sun, 09 Sep 2012 06:43:16 +0900, shelarcy <shel...@gmail.com> wrote:
> こんにちは。
>
> GHC 7.6.1 がリリースされてますね。
>
> (snip)
>
> * bytestring への blaze-builder の統合
>
> bytestring パッケージに blaze-builder の Builder が機能として統合されました。この機能は融合変換を提供していない現在の ByteString に対し、差分リスト的な方法で効率的な連結処理などを提供するためのものです。(もちろん、融合変換を提供しているライブラリでも、融合変換がうまくいかないような状況では blaze-builder の恩恵があります。)
>
> ByteString 同士の連結処理を多様する場合、直接 ByteString 同士を連結せずに、Data.ByteString.Lazy.Builderで提供されているBuilderを利用することを考えてみると良いでしょう。
>
> http://www.haskell.org/ghc/docs/7.6.1/html/libraries/bytestring-0.10.0.0/Data-ByteString-Lazy-Builder.html
> http://hackage.haskell.org/package/blaze-builder
> http://www.mew.org/~kazu/material/2012-builder.pdf
>
> また、Builder では charUtf8 関数や stringUtf8 関数などを通して UTF-8 の文字列を扱うことができます。ByteString に UTF-8 の文字列を渡すために止むを得ず utf8-string パッケージを使っている方も、できればこちらを使うようにした方が良いでしょう。(なお、Text を使えるでのあれば、もちろん ByteString ではなくそちらを使うようにしてください。)
>
> http://www.haskell.org/ghc/docs/7.6.1/html/libraries/bytestring-0.10.0.0/Data-ByteString-Lazy-Builder.html#g:10
Reply all
Reply to author
Forward
0 new messages