関数型プログラミング言語Haskell Part20
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2012/10/17(水) 08:08:28.97ttp://www.haskell.org/
日本語サイト
ttp://www.sampou.org/cgi-bin/haskell.cgi
ttp://www.shido.info/hs/
過去ログ
関数型プログラミング言語Haskell
Part1 ttp://pc.2ch.net/tech/kako/996/996131288.html
Part2 ttp://pc2.2ch.net/test/read.cgi/tech/1013846140/
Part3 ttp://pc8.2ch.net/test/read.cgi/tech/1076418993/
Part4 ttp://pc8.2ch.net/test/read.cgi/tech/1140717775/
Part5 ttp://pc8.2ch.net/test/read.cgi/tech/1149263630/
Part6 ttp://pc11.2ch.net/test/read.cgi/tech/1162902266/
Part7 ttp://pc11.2ch.net/test/read.cgi/tech/1174211797/
Part8 ttp://pc11.2ch.net/test/read.cgi/tech/1193743693/
Part9 ttp://pc11.2ch.net/test/read.cgi/tech/1211010089/
Part10 ttp://pc12.2ch.net/test/read.cgi/tech/1231861873/
Part11 ttp://pc12.2ch.net/test/read.cgi/tech/1252382593/
Part12 ttp://hibari.2ch.net/test/read.cgi/tech/1272536128/
Part13 ttp://hibari.2ch.net/test/read.cgi/tech/1286706874/
Part14 ttp://hibari.2ch.net/test/read.cgi/tech/1299385928/
Part15 ttp://hibari.2ch.net/test/read.cgi/tech/1310199414/
Part16 ttp://toro.2ch.net/test/read.cgi/tech/1317958045/
Part17 ttp://toro.2ch.net/test/read.cgi/tech/1325510368/
Part18 ttp://toro.2ch.net/test/read.cgi/tech/1331902463/
Part19 ttp://toro.2ch.net/test/read.cgi/tech/1340760070/
0237デフォルトの名無しさん
2012/11/04(日) 23:37:47.36[x / y | y /= 0] のような書き方を見ないのは何故だ?
0238デフォルトの名無しさん
2012/11/04(日) 23:38:52.870239デフォルトの名無しさん
2012/11/04(日) 23:43:08.500240デフォルトの名無しさん
2012/11/04(日) 23:50:31.340241デフォルトの名無しさん
2012/11/04(日) 23:51:42.79do形式や内包表記さらにはアプリカティブファンクターの式なんかの好きな書き方ができるんだよね
0242デフォルトの名無しさん
2012/11/04(日) 23:53:14.08復活といっても GHC の言語拡張ですよ。
if y /= 0 then Just (x / y) else Nothing
[x / y | y /= 0]
どちらがプログラムの意味を理解しやすいかは読み手の経験によるでしょうが、
私は前者の方を使いたいですね。
0243デフォルトの名無しさん
2012/11/05(月) 00:01:01.45> 内包表記がリスト以外のモナドで使える意味が分からないのか
なんて訊くまでもないよね。
だって使えるかどうかに関わらずキモいから使わないんでしょ?
0244デフォルトの名無しさん
2012/11/05(月) 00:26:31.37>>323
> 遊びにしか使えない例なら、そんなもので意味を探るのは無理だから、要らない。
[x / y | y /= 0] これが遊びでないと言うのなら、>>237 はどう説明する?
なぜ書籍ではこのような書き方が紹介されない?
俺は内包表記がリスト以外のモナドで使えるのは、意味なんて何も無いと思う。
最初は、モナドだとどんなものでも内包表記ができちゃう事を発見したから、
プログラマがなんか役立つ使い方をしてくれるだろうという安直な考えで、
リスト以外にも使えるモナド内包表記が作られたんじゃないかな。
設計者自身に明確な目的なんてきっと無いでしょ。
その後、たいして上手い使い方も無いまま復活した理由が不明だが。
0245デフォルトの名無しさん
2012/11/05(月) 00:43:08.53ていうか、書籍に書いてあるかどうかで判断したいなら
こんなとこで他人に聞く必要もないだろ?
0246デフォルトの名無しさん
2012/11/05(月) 00:49:09.20なんでリストで内包表記が使えるのは意味があるの?
do構文があれば要らないよね?
0247デフォルトの名無しさん
2012/11/05(月) 00:49:49.28そりゃ自分で書いてる通り、最近復活したからでしょ
そのうちリスト以外でもイディオムが生まれてくるよ
0248デフォルトの名無しさん
2012/11/05(月) 04:01:00.46:(;゙゚'ω゚'):内包表記って[と]で括られてるからリスト専用だと思ってた……
今までは偽りの人生だった……
0249デフォルトの名無しさん
2012/11/05(月) 04:08:25.37スレ間違えてるよな
0250デフォルトの名無しさん
2012/11/05(月) 04:19:05.02というかZIPでくれと言い出す奴
0251デフォルトの名無しさん
2012/11/05(月) 05:35:28.680252デフォルトの名無しさん
2012/11/05(月) 06:23:16.95これはなかなかおもしろいな
0253デフォルトの名無しさん
2012/11/05(月) 06:36:23.36詳しい解説サンクス
それならPerl忍者が荒らすのも分かる気がする(´・ω・`)
0254デフォルトの名無しさん
2012/11/05(月) 07:21:11.08じゃあ、本は無しにしようか。
現場に限ってもいいし、
何なら HackageDB に登録されているライブラリ内に限定してもいいが、
それでもスレ違いか?
プログラム言語において機能を実装するというのは、
使うことによってメリットがあると想定されるからだろう。
Haskell は実用もしっかりできる関数型言語を目指して生まれたのだから、
なおさらだ。
Haskell98 で言語仕様から消えたモナド内包表記が、
最近になってGHCの言語拡張として復活したのは、どういう意図があって?
モナド内包表記が欲しいと思っていた人たちは、
どういうシーンでそれが活用できると考えていたの?
その辺りが知りたい。
正直言って、>>236 の例では恩恵が実感できない。
「好きな書き方で書けば良い」という理由だけで復活したとも思えん。
それでは Perl みたいじゃないか。
0255デフォルトの名無しさん
2012/11/05(月) 07:28:03.96(長くなるならmapなりfilterなりdoなり使うべき)
だから短いコードだから内包表記で書く意義が
分からないってワケじゃないだろう
ってことは、こっちは>>254様が納得する理由をエスパーしてやらなきゃ
ダメってことなワケだが、なんでそんなことしてやる必要あるの?
0256デフォルトの名無しさん
2012/11/05(月) 07:28:37.24>>247
0257デフォルトの名無しさん
2012/11/05(月) 07:49:04.08http://hackage.haskell.org/trac/ghc/ticket/4370
http://hackage.haskell.org/trac/ghc/wiki/MonadComprehensions
0258デフォルトの名無しさん
2012/11/05(月) 12:01:23.74Data.Vectorで組んで動いたコードをData.Vector.Unboxedに切り替えようと思ったんすよ
そしたら急にVectorはファンクタじゃないからfmap使えないよ Probable fix 云々ってクレーム来たんすけど
どゆことっすか?ファンクタでしょ?
0259デフォルトの名無しさん
2012/11/05(月) 15:54:09.94メッセージ全文うpらないのは甘え
0260デフォルトの名無しさん
2012/11/05(月) 19:08:43.11ありがと。
前者は単にモナド内包表記と同等の do 表記をいくつか例示してるだけじゃん。
誤解を恐れずに言えば、モナド内包表記の操作的意味論っぽいものを示してるだけ。
ただ、そのページに論文「Bringing Back Monad Comprehensions」へのリンクがあった。
こっちはざっと見たところ「現実的な問題提起 --> モナド内包表記による解決」
という感じで語っているような気がするから、実用的なことが書かれていそうだ。
これからじっくり読んでみるよ。
後者の方はこの論文と同名なんだが、同じもの?
至る所に訂正の跡があるのだが、最新版ってことかな?
どちらにしても、「Bringing Back Monad Comprehensions」
こういう情報が欲しかったんだ。
0261デフォルトの名無しさん
2012/11/05(月) 19:12:58.71unboxed vectorは関手じゃないよ(腹が立つのは分かる)
関手なら fmap :: (a -> b) -> Vector a -> Vector b
が定義できなきゃならんけど、unboxed vectorだとb=Integerとかにできない
(Unbox制約を満たさないといけないから)
0262デフォルトの名無しさん
2012/11/05(月) 19:21:08.080263デフォルトの名無しさん
2012/11/05(月) 19:24:41.98Haskellでいう関手はこれ
圏論の関手は他を当たってね!
0264デフォルトの名無しさん
2012/11/05(月) 19:29:59.09マジすか
複雑な事情っすね
実践よりもHaskell型システムの理解に的を絞ったサイトないっすか?
0265デフォルトの名無しさん
2012/11/05(月) 19:30:38.26map を関手の一つと考えると、関手から自然変換まで簡単に理解できる
簡単に理解できる = 毎日30分定義とにらめっこして1週間ぐらい悩むと分かる
0266デフォルトの名無しさん
2012/11/05(月) 19:41:26.25Functor クラスが関手のことなら、なにも漢字で書かなくてもよくない?
unboxed vector は Functor クラスのインスタンスじゃないから、
と言う方がはるかに分かりやすいというか、ストレートだと思うんだが
と感じるのは私だけ?
0267デフォルトの名無しさん
2012/11/05(月) 19:44:20.770268デフォルトの名無しさん
2012/11/05(月) 19:52:07.99定着してる訳語があるのに横文字や片仮名を使うのは宗教上の理由でできんのです、ごめんなさい
0269デフォルトの名無しさん
2012/11/05(月) 19:55:12.71ギャグとしてはあまり面白くない
0270デフォルトの名無しさん
2012/11/05(月) 20:02:00.78魔女を焼き払えーっ!
0271デフォルトの名無しさん
2012/11/05(月) 20:04:44.170272デフォルトの名無しさん
2012/11/05(月) 20:14:25.77Functor クラスそのものは関手なの?
Functor クラスがたまたま持つ性質(種数やfmap関数など)を持つものが関手なの?
たとえば Applicative なども関手?
Functor クラス自身とそのインスタンスのみが関手?
Functor クラスそのもののみが関手で、そのインスタンスは集合の要素みたいなもの?
わけが分からなくなった・・・
>>271
一人称「私」なんて誰でも使うから、賢そうに見える要素にならないでしょ
0273デフォルトの名無しさん
2012/11/05(月) 20:20:11.08二番目が一番近いと思う
0274デフォルトの名無しさん
2012/11/05(月) 20:24:02.72そうだとすると、>>268 の言う「定着してる訳語」っておかしくないか?
>>268 の言い方だと Functor の日本語訳が関手である、
と言っているように聞こえる
0275デフォルトの名無しさん
2012/11/05(月) 20:29:18.54圏論でFunctorの訳語が関手だから、それ以外に訳しようがない
0276デフォルトの名無しさん
2012/11/05(月) 20:33:04.720277デフォルトの名無しさん
2012/11/05(月) 20:38:18.43今後Haskellのファンクタの意味で関手といいたい場合
いわゆる関手
と書くことにしよう
0278デフォルトの名無しさん
2012/11/05(月) 20:39:30.80HaskellのFunctorクラスのインスタンスはある種の(圏論的な意味の)関手(の対象部分)になってる
具体的にはHask圏からHask圏への関手
逆に、ある型構築子が(圏論的な意味の)関手になっていてもFunctorのインスタンスとは限らない
たとえば>>258のunboxed vectorがそう
0279デフォルトの名無しさん
2012/11/05(月) 20:48:17.32じゃあ、HaskellのFunctorクラスを安易に関手と言うのは、
文脈によっては危険じゃないか?
どの文脈だと危険か正しく理解してる奴しか使えない訳語な感じがするが
0280デフォルトの名無しさん
2012/11/05(月) 20:53:08.78もちろん混乱の原因になることはあるけど、
*Functorのインスタンスを関手と呼ぶ
のをその論法で禁止したら、
*Monadのインスタンスをモナドと呼ぶ
*Monoidのインスタンスをモノイドと呼ぶ
*Numのインスタンスを数値型と呼ぶ
あたりも言えなくなって不便じゃないか
0281デフォルトの名無しさん
2012/11/05(月) 20:53:32.47という理解は正しいでしょうか?
0282デフォルトの名無しさん
2012/11/05(月) 20:59:21.14「恒等関数と関数結合を保存する高階関数」と言った方が良さそう
0283デフォルトの名無しさん
2012/11/05(月) 21:09:19.730284デフォルトの名無しさん
2012/11/05(月) 21:12:51.87なるほど、そう言われると、たしかに不便だな。
Haskell の話をしていると判りきっている時には
Monad のインスタンスはモナドと言いたい。
(個人的にはFunctorのインスタンスはファンクタと言いたいが)
でも、Haskell の話をしてるときに、いきなり圏論が姿を現し、
そのまま議論が進んでいくと、ややこしくならない?
そういうシーンをこのスレでよく見かける
0285デフォルトの名無しさん
2012/11/05(月) 22:05:15.91一人称を私にすると賢そうに見えるの法則
賢くみられたいからHaskellやるという法則
0286デフォルトの名無しさん
2012/11/05(月) 22:11:23.06賢く見られたいんならMITで博士号取るだろ普通
0287デフォルトの名無しさん
2012/11/05(月) 22:47:19.80ギャグとしてはあまりおもしろくない
0288デフォルトの名無しさん
2012/11/05(月) 22:51:06.92一度目はいいけど、二度やると冷める
もう止めた方がいいと思うよ
0289デフォルトの名無しさん
2012/11/05(月) 23:09:11.87ghci 上で Data.Conduit系モジュールがロード処理されると、
エラーが出る。
Loading package conduit-0.5.2.7 ... linking ... <interactive>: internal error: R
_X86_64_PC32: High bits are set in 7fefb411866 for _close
(GHC version 7.6.1 for x86_64_unknown_mingw32)
Please report this as a GHC bug: http://www.haskell.org/ghc/reportabug
これはバグ?
俺英語書けなくてバグ報告できないんだが、詰んだかな
0290289
2012/11/05(月) 23:10:49.65でも色々実験して勉強しようと思ってたんだが、ghci 使えないとなると、
かなり面倒になるなぁ・・・
0291デフォルトの名無しさん
2012/11/05(月) 23:12:17.93関手とはある圏の対象と射をもう一つの圏(自己関手の場合は同じ圏)に移すものだから、
Functorのインスタンスとfmapセットで関手と言うのが一番近い
0292デフォルトの名無しさん
2012/11/05(月) 23:37:08.23こいつ>>285のレスに図星しすぎれレスしてやがる
だいたいのやつは必死に悔しくても反応したら負けっていう考え持ってるから食いつかない
こいつは食いついた正直者
0293デフォルトの名無しさん
2012/11/05(月) 23:41:21.48たぶんWindows固有の問題
LinuxかMacを使うとか、Windowsなら仮想マシン上でLinux使えば、問題が出ない可能性が高い
この手の開発はUnix系メインでやっててWindowsはオマケのことが多いから、
細かいとこで目の行き届かない不具合があったりする
0294デフォルトの名無しさん
2012/11/05(月) 23:41:35.04正直それはそれで非常に恥ずかしい思いをしている
0295デフォルトの名無しさん
2012/11/05(月) 23:41:49.81○○をしなくなるのが情弱
Matzみたいなのが「これから来る言語」 Haskellとか言ったら
すぐ真似して
Haskellしだすやつが情弱
>>286=こいつ最高に図星
0296デフォルトの名無しさん
2012/11/05(月) 23:44:42.210297289
2012/11/05(月) 23:45:16.42ありがと
とりあえず勉強だけなら処理速度は要らないから、
vm player に linux 入れて、そっちでやってみるよ
0298デフォルトの名無しさん
2012/11/06(火) 00:53:45.21どうせネットで偉い人のマネする以上の教育課程が揃ってないんだから
0299デフォルトの名無しさん
2012/11/06(火) 07:18:02.31まったく向いてないからリアル土方に転向したほうが良いよ?
0300デフォルトの名無しさん
2012/11/06(火) 07:31:54.96元からそのつもりだったのか?
いや、そういう文体には見えないなあ
要するに>>299はアホなんだろう
0301デフォルトの名無しさん
2012/11/06(火) 07:33:11.89大学でも別にプログラミングなんて独学だっただろ?
え?大学行ってないの?
0302デフォルトの名無しさん
2012/11/06(火) 07:34:45.38ってこと
ほんとに大学行ってるの?
0303デフォルトの名無しさん
2012/11/06(火) 07:36:37.37と書いてるようにしか読めんのだが
教育されなきゃ実用的なプログラミングも出来ないアホは向いてないよ
0304デフォルトの名無しさん
2012/11/06(火) 07:41:52.94自分の発言にあとから留保つけちゃってるし
まあ俺は>>298じゃないからいいんだけどさ
0305デフォルトの名無しさん
2012/11/06(火) 07:44:55.65自分で考える脳みそ無いし
0306デフォルトの名無しさん
2012/11/06(火) 07:48:21.060307デフォルトの名無しさん
2012/11/06(火) 09:29:03.76( ´Д`) <みなさーん、お茶が入りましたよ〜
/ \
| l l | ..,. ., .,
| | | _|。.:_::゜。-.;.:゜。:.:;。
ヽ \_ .。'゚/ `。:、`;゜:;.::.。:.:。
/\_ン∩ソ\ ::..゜:: ゚。:.:.::.。.。:.
. / /`ー'ー'\ \ ゜: ::..゜:: ゚。:.:.:,。:.:.
〈 く / / ::..゜:: ゚。:.:.:,.:.:.:。:.:,
. \ L ./ / _::..゜:: ゚。:.:.:,.:.:,.:.:.:,
〉 ) ( .::旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦.
(_,ノ .`ー'旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦.
0308デフォルトの名無しさん
2012/11/06(火) 10:19:19.89実用度外視なんだから、偉いやつが言ったことをすぐ真似してHaskellやるのが正解
どうせネットで偉い人のマネする以上の教育課程が揃ってないんだから
305 名前:デフォルトの名無しさん[sage] 投稿日:2012/11/06(火) 07:44:55.65
アホが偉い人のマネすべきってのはその通りだな
自分で考える脳みそ無いし
0309デフォルトの名無しさん
2012/11/06(火) 10:58:32.920310デフォルトの名無しさん
2012/11/06(火) 14:23:00.820311デフォルトの名無しさん
2012/11/06(火) 17:31:28.63じゃあfmap的なことはどう実現したらいいんですか!?
0312デフォルトの名無しさん
2012/11/06(火) 18:24:59.42Data.Vector.Unboxed.map
0313デフォルトの名無しさん
2012/11/06(火) 19:07:44.24(////)
0314デフォルトの名無しさん
2012/11/06(火) 19:14:05.470315デフォルトの名無しさん
2012/11/06(火) 23:10:36.990316デフォルトの名無しさん
2012/11/08(木) 19:52:02.96遅延評価される場合のたらいまわし関数の呼び出され回数というものが知りたくて以下のように書きました。
import Control.Monad.Writer
tak :: Int -> Int -> Int -> Writer (Sum Int) Int
tak x y z
| x <= y = do
tell(Sum 1)
return z
| otherwise = do
tell(Sum 1)
tak (fst(runWriter(tak (x - 1) y z)))
(fst(runWriter(tak (y - 1) z x)))
(fst(runWriter(tak (z - 1) x y)))
これで動くは動くんですが、引数を色々変えてもカウントが高々3でした。
少し考えてみて、再帰で呼んだ結果のカウントを捨ててるせいだろうというのは分かったのですが
改善策が思いつきません。上手い書き方があったら教えてもらえないでしょうか。
また、もしWriterでカウントするのが無理だとしたらどうするのが定石でしょうか?
0317デフォルトの名無しさん
2012/11/08(木) 20:03:07.81もしかしてHaskellって、Prologよりも抽象度が高いのかも。
実際にプログラムを作るまでになれば、泥臭いこともいろいろあるんだろうけど。
0318デフォルトの名無しさん
2012/11/08(木) 21:19:45.25関数の評価回数を知りたいだけでしたら、プロファイリングすれば簡単にわかりますよ。
コンパイル時に3つのオプション "-rtsopts -prof -auto-all" を付けて、
実行ファイルの起動時にRTSオプション "+RTS -p" を付ければ、
*.prof ファイルができるんで、それを読めばいいです。
prof ファイルの一番下の表を見てください。
1列目に関数名(変数も関数)、2列目にモジュール名とあって、
4列目の "entries" の項目が評価回数です。
例えば z を返すバージョンの tak 関数を使って、
main :: IO
main = do
let z = tak 3 2 1
print z
を上記のようにコンパイルして実行してできた prof ファイルを見ると、
tak の評価回数は 5 と表記されています。
(実際に手計算で let z = tak 3 2 1 を簡約すると、
確かに5回 tak 関数が評価されていることが確認できます)
プロファイリングの詳細は「本物のプログラマはHaskellを使う」
の第45回の記事を参考にしてください。
こういうことではなく、プログラムの中でカウントする仕組みを作るには、
という趣旨の質問でしょうか?
0319デフォルトの名無しさん
2012/11/08(木) 21:33:42.67tak x y z
| x <= y = do
tell(Sum 1)
return z
| otherwise = do
tell(Sum 1)
x' <- tak (x - 1) y z ;変えた
y' <- tak (y - 1) z x ;変えた
z' <- tak (z - 1) x y ;変えた
tak x' y' z' ;変えた
0320デフォルトの名無しさん
2012/11/08(木) 21:46:20.040321デフォルトの名無しさん
2012/11/08(木) 21:46:32.28すみません、書き忘れました。
仰る通りプログラムの中でカウントする仕組みを作るには、という趣旨です。
>>319
それをやると遅延評価の場合と結果変わっちゃいませんかね?
0322319
2012/11/08(木) 21:57:07.69snd(runWriter(tak 100 50 0))とかやると糞時間かかりますね。
あとここちょっと違ってます。
| x <= y = do
tell(Sum 1)
return y; 変えた
0324デフォルトの名無しさん
2012/11/08(木) 22:33:46.28Haskellは純粋だから、評価順序によって違う値を返す関数は書けない。遅延評価を前提とした呼び出し回数を数えるには、明示的に遅延評価をエミュレートする必要がある
import Control.Applicative
import Control.Monad.ST
import Data.STRef
thunk :: ST s a -> ST s (ST s a)
thunk action = do
ref <- newSTRef Nothing
return $ do
cache <- readSTRef ref
case cache of
Just val -> return val
Nothing -> do val <- action; writeSTRef ref (Just val); return val
tak :: STRef s Int -> ST s Int -> ST s Int -> ST s Int -> ST s Int
tak counter ex ey ez = do
modifySTRef counter (+1)
x <- ex; y <- ey
if x <= y
then ey
else do
a <- thunk $ tak counter (pred <$> ex) ey ez
b <- thunk $ tak counter (pred <$> ey) ez ex
c <- thunk $ tak counter (pred <$> ez) ex ey
tak counter a b c
takCount :: Int -> Int -> Int -> Int
takCount x y z = runST (do
counter <- newSTRef 0
_ <- tak counter (return x) (return y) (return z)
readSTRef counter)
0325324
2012/11/08(木) 22:35:38.37実体参照は適当に戻してね!
0326デフォルトの名無しさん
2012/11/08(木) 22:36:17.950327デフォルトの名無しさん
2012/11/08(木) 22:53:32.55ありがとうございます、言い切ってもらえると参考になります。
今すごいH本をやっと読み終わろうかという段階なので正直難しいですが、
そのうち理解できるように精進します。
0328デフォルトの名無しさん
2012/11/08(木) 23:43:06.04インデントは全角空白派が大勝利で悔しい
仕様変更の経緯のわかるスレとかあればどなたかプリーズ
0329デフォルトの名無しさん
2012/11/09(金) 13:58:18.49アイドル時にやってくれる?
0330デフォルトの名無しさん
2012/11/09(金) 18:56:23.67メモリが足りなくなったら
0331デフォルトの名無しさん
2012/11/09(金) 19:22:04.750332デフォルトの名無しさん
2012/11/09(金) 19:22:21.31今入力待ちで暇だなー……
あ、もう要らない領域あんじゃん
スカベンジスカベンジ……
こうはならないの?
0333デフォルトの名無しさん
2012/11/09(金) 19:23:42.68あり^^
0334デフォルトの名無しさん
2012/11/09(金) 21:15:13.21これって需要あるの?
{-# LANGUAGE TransformListComp #-}
import GHC.Exts (groupWith)
xs = [1,3,4,5,7,9,10,11,13]
ys = [x | (x,y) <- zip xs [1..], then group by x-y using groupWith]
0335デフォルトの名無しさん
2012/11/11(日) 15:48:20.65ライブラリドキュメントの Data.Conduit にチュートリアルがありますが、
sourceList [1..10] $$ fold (+) 0 これの結果がどうなるか調べる方法を探しています。
チュートリアルでは、恐らく ghci 上で上記の式を評価して、
55 という数字が標準出力に出力されている様子が描かれていると思いますが、
私は Windows で GHC 7.6.1 を使っているため、ghci で conduit が使えません。
試しに次のようにしてみても、コンパイルエラーが出ます。
a :: GSink Int IO Int
a = sourceList [1..10] $$ fold (+) 0
main :: IO ()
main = print a
--------------------------------
No instance for (Show (Pipe l0 Int o0 u0 IO Int))
arising from a use of `print'
--------------------------------
どうすればチュートリアルのように
sourceList [1..10] $$ fold (+) 0 の評価結果を数値または数字で得る、
あるいは標準出力へ出力することができるでしょうか。
0336355
2012/11/11(日) 16:02:03.19これでできました。
a :: GSink () IO Int
a = sourceList [1..10] $$ fold (+) 0
main :: IO ()
main = do
a <- runPipe a
print a
なんか不親切なチュートリアルですね。
最初の sourceFile の例ではちゃんと runResourceT があるのに。
■ このスレッドは過去ログ倉庫に格納されています