[表示 : 全て 最新50 1-99 101- 201- 301- 2chのread.cgiへ]
Update time : 11/22 12:05 / Filesize : 103 KB / Number-of Response : 396
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

関数型プログラミング言語Haskell Part20



1 名前:デフォルトの名無しさん [2012/10/17(水) 08:08:28.97 ]
haskell.org
ttp://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/

237 名前:デフォルトの名無しさん mailto:sage [2012/11/04(日) 23:37:47.36 ]
いろんなライブラリ内で Maybe が使われているのを見るが、
[x / y | y /= 0] のような書き方を見ないのは何故だ?

238 名前:デフォルトの名無しさん mailto:sage [2012/11/04(日) 23:38:52.87 ]
モナド内包表記が復活したのって最近でしょ?

239 名前:デフォルトの名無しさん mailto:sage [2012/11/04(日) 23:43:08.50 ]
可読性もありそう

240 名前:デフォルトの名無しさん mailto:sage [2012/11/04(日) 23:50:31.34 ]
そんなキモい書き方するのなんてゴルファー()ぐらいたろ

241 名前:デフォルトの名無しさん mailto:sage [2012/11/04(日) 23:51:42.79 ]
モナドのインターフェースを持ってるから、>>211みたいに
do形式や内包表記さらにはアプリカティブファンクターの式なんかの好きな書き方ができるんだよね

242 名前:デフォルトの名無しさん mailto:sage [2012/11/04(日) 23:53:14.08 ]
>238
復活といっても GHC の言語拡張ですよ。


if y /= 0 then Just (x / y) else Nothing
[x / y | y /= 0]

どちらがプログラムの意味を理解しやすいかは読み手の経験によるでしょうが、
私は前者の方を使いたいですね。

243 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 00:01:01.45 ]
内包表記をリスト以外に使うのがキモいのなら

> 内包表記がリスト以外のモナドで使える意味が分からないのか

なんて訊くまでもないよね。
だって使えるかどうかに関わらずキモいから使わないんでしょ?

244 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 00:26:31.37 ]
>>243

>>323
> 遊びにしか使えない例なら、そんなもので意味を探るのは無理だから、要らない。

[x / y | y /= 0] これが遊びでないと言うのなら、>>237 はどう説明する?
なぜ書籍ではこのような書き方が紹介されない?


俺は内包表記がリスト以外のモナドで使えるのは、意味なんて何も無いと思う。

最初は、モナドだとどんなものでも内包表記ができちゃう事を発見したから、
プログラマがなんか役立つ使い方をしてくれるだろうという安直な考えで、
リスト以外にも使えるモナド内包表記が作られたんじゃないかな。
設計者自身に明確な目的なんてきっと無いでしょ。

その後、たいして上手い使い方も無いまま復活した理由が不明だが。

245 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 00:43:08.53 ]
結論ありきなら議論する意味なんて無いってだけだよ。
ていうか、書籍に書いてあるかどうかで判断したいなら
こんなとこで他人に聞く必要もないだろ?



246 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 00:49:09.20 ]
>>244
なんでリストで内包表記が使えるのは意味があるの?
do構文があれば要らないよね?

247 名前:デフォルトの名無しさん [2012/11/05(月) 00:49:49.28 ]
>なぜ書籍ではこのような書き方が紹介されない?
そりゃ自分で書いてる通り、最近復活したからでしょ
そのうちリスト以外でもイディオムが生まれてくるよ

248 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 04:01:00.46 ]
>>236
:(;゙゚'ω゚'):内包表記って[と]で括られてるからリスト専用だと思ってた……
       今までは偽りの人生だった……

249 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 04:08:25.37 ]
本に書いてあって現場で使われているものにしか興味ないなら
スレ間違えてるよな

250 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 04:19:05.02 ]
エロゲの攻略法わかんなくてゲームの意義を問う
というかZIPでくれと言い出す奴

251 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 05:35:28.68 ]
サワーグレープセオリー

252 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 06:23:16.95 ]
ghciだと:set -XMonadComprehensionsでモナド内包表記が有効になるのか
これはなかなかおもしろいな

253 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 06:36:23.36 ]
>>252
詳しい解説サンクス
それならPerl忍者が荒らすのも分かる気がする(´・ω・`)

254 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 07:21:11.08 ]
>>249
じゃあ、本は無しにしようか。

現場に限ってもいいし、
何なら HackageDB に登録されているライブラリ内に限定してもいいが、
それでもスレ違いか?

プログラム言語において機能を実装するというのは、
使うことによってメリットがあると想定されるからだろう。

Haskell は実用もしっかりできる関数型言語を目指して生まれたのだから、
なおさらだ。

Haskell98 で言語仕様から消えたモナド内包表記が、
最近になってGHCの言語拡張として復活したのは、どういう意図があって?
モナド内包表記が欲しいと思っていた人たちは、
どういうシーンでそれが活用できると考えていたの?
その辺りが知りたい。

正直言って、>>236 の例では恩恵が実感できない。
「好きな書き方で書けば良い」という理由だけで復活したとも思えん。
それでは Perl みたいじゃないか。

255 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 07:28:03.96 ]
内包表記なんて長いコードに使うもんじゃない
(長くなるならmapなりfilterなりdoなり使うべき)
だから短いコードだから内包表記で書く意義が
分からないってワケじゃないだろう

ってことは、こっちは>>254様が納得する理由をエスパーしてやらなきゃ
ダメってことなワケだが、なんでそんなことしてやる必要あるの?



256 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 07:28:37.24 ]
>>254
>>247

257 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 07:49:04.08 ]
>>254
hackage.haskell.org/trac/ghc/ticket/4370
hackage.haskell.org/trac/ghc/wiki/MonadComprehensions

258 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 12:01:23.74 ]
サーセン
Data.Vectorで組んで動いたコードをData.Vector.Unboxedに切り替えようと思ったんすよ

そしたら急にVectorはファンクタじゃないからfmap使えないよ Probable fix 云々ってクレーム来たんすけど

どゆことっすか?ファンクタでしょ?

259 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 15:54:09.94 ]
>>258
メッセージ全文うpらないのは甘え

260 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 19:08:43.11 ]
>>257
ありがと。

前者は単にモナド内包表記と同等の do 表記をいくつか例示してるだけじゃん。
誤解を恐れずに言えば、モナド内包表記の操作的意味論っぽいものを示してるだけ。

ただ、そのページに論文「Bringing Back Monad Comprehensions」へのリンクがあった。
こっちはざっと見たところ「現実的な問題提起 --> モナド内包表記による解決」
という感じで語っているような気がするから、実用的なことが書かれていそうだ。
これからじっくり読んでみるよ。

後者の方はこの論文と同名なんだが、同じもの?
至る所に訂正の跡があるのだが、最新版ってことかな?

どちらにしても、「Bringing Back Monad Comprehensions」
こういう情報が欲しかったんだ。

261 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 19:12:58.71 ]
>>258
unboxed vectorは関手じゃないよ(腹が立つのは分かる)
関手なら fmap :: (a -> b) -> Vector a -> Vector b
が定義できなきゃならんけど、unboxed vectorだとb=Integerとかにできない
(Unbox制約を満たさないといけないから)

262 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 19:21:08.08 ]
最近流行ってる関手って、そもそも何?

263 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 19:24:41.98 ]
www.haskell.org/ghc/docs/latest/html/libraries/base-4.6.0.0/Prelude.html#t:Functor
Haskellでいう関手はこれ
圏論の関手は他を当たってね!

264 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 19:29:59.09 ]
>>261
マジすか
複雑な事情っすね
実践よりもHaskell型システムの理解に的を絞ったサイトないっすか?

265 名前:デフォルトの名無しさん [2012/11/05(月) 19:30:38.26 ]
>>262
map を関手の一つと考えると、関手から自然変換まで簡単に理解できる

簡単に理解できる = 毎日30分定義とにらめっこして1週間ぐらい悩むと分かる



266 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 19:41:26.25 ]
>>263
Functor クラスが関手のことなら、なにも漢字で書かなくてもよくない?

unboxed vector は Functor クラスのインスタンスじゃないから、
と言う方がはるかに分かりやすいというか、ストレートだと思うんだが

と感じるのは私だけ?

267 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 19:44:20.77 ]
知らんがな

268 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 19:52:07.99 ]
>>266
定着してる訳語があるのに横文字や片仮名を使うのは宗教上の理由でできんのです、ごめんなさい

269 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 19:55:12.71 ]
>>268
ギャグとしてはあまり面白くない

270 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 20:02:00.78 ]
女だ! このスレに女が紛れ込んでるぞぉーっ!
魔女を焼き払えーっ!

271 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 20:04:44.17 ]
一人称を私にすると賢そうに見えるの法則

272 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 20:14:25.77 ]
ん?

Functor クラスそのものは関手なの?

Functor クラスがたまたま持つ性質(種数やfmap関数など)を持つものが関手なの?
たとえば Applicative なども関手?

Functor クラス自身とそのインスタンスのみが関手?

Functor クラスそのもののみが関手で、そのインスタンスは集合の要素みたいなもの?

わけが分からなくなった・・・


>>271
一人称「私」なんて誰でも使うから、賢そうに見える要素にならないでしょ

273 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 20:20:11.08 ]
>>272
二番目が一番近いと思う

274 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 20:24:02.72 ]
>>273
そうだとすると、>>268 の言う「定着してる訳語」っておかしくないか?

>>268 の言い方だと Functor の日本語訳が関手である、
と言っているように聞こえる

275 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 20:29:18.54 ]
>>274
圏論でFunctorの訳語が関手だから、それ以外に訳しようがない



276 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 20:33:04.72 ]
圏論でFunctorと、haskellのFunctorクラスは同じもの?

277 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 20:38:18.43 ]
わかった
今後Haskellのファンクタの意味で関手といいたい場合
いわゆる関手
と書くことにしよう

278 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 20:39:30.80 ]
>>276
HaskellのFunctorクラスのインスタンスはある種の(圏論的な意味の)関手(の対象部分)になってる
具体的にはHask圏からHask圏への関手
逆に、ある型構築子が(圏論的な意味の)関手になっていてもFunctorのインスタンスとは限らない
たとえば>>258のunboxed vectorがそう

279 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 20:48:17.32 ]
>>278
じゃあ、HaskellのFunctorクラスを安易に関手と言うのは、
文脈によっては危険じゃないか?

どの文脈だと危険か正しく理解してる奴しか使えない訳語な感じがするが

280 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 20:53:08.78 ]
>>279
もちろん混乱の原因になることはあるけど、
*Functorのインスタンスを関手と呼ぶ
のをその論法で禁止したら、
*Monadのインスタンスをモナドと呼ぶ
*Monoidのインスタンスをモノイドと呼ぶ
*Numのインスタンスを数値型と呼ぶ
あたりも言えなくなって不便じゃないか

281 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 20:53:32.47 ]
単位元と結合律を保存する高階関数は関手
という理解は正しいでしょうか?

282 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 20:59:21.14 ]
>>281
「恒等関数と関数結合を保存する高階関数」と言った方が良さそう

283 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 21:09:19.73 ]
関手はFunctorではなくfmapじゃないのん?

284 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 21:12:51.87 ]
>>280
なるほど、そう言われると、たしかに不便だな。
Haskell の話をしていると判りきっている時には
Monad のインスタンスはモナドと言いたい。
(個人的にはFunctorのインスタンスはファンクタと言いたいが)

でも、Haskell の話をしてるときに、いきなり圏論が姿を現し、
そのまま議論が進んでいくと、ややこしくならない?

そういうシーンをこのスレでよく見かける

285 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 22:05:15.91 ]
271 名前:デフォルトの名無しさん[sage] 投稿日:2012/11/05(月) 20:04:44.17
一人称を私にすると賢そうに見えるの法則



賢くみられたいからHaskellやるという法則



286 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 22:11:23.06 ]
賢く見られたいからHaskellって・・・

賢く見られたいんならMITで博士号取るだろ普通

287 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 22:47:19.80 ]
>>286
ギャグとしてはあまりおもしろくない

288 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 22:51:06.92 ]
>>287
一度目はいいけど、二度やると冷める

もう止めた方がいいと思うよ

289 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 23:09:11.87 ]
GHC 7.6.1 の ghci 上で Conduit が動かない

ghci 上で 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: www.haskell.org/ghc/reportabug

これはバグ?

俺英語書けなくてバグ報告できないんだが、詰んだかな

290 名前:289 mailto:sage [2012/11/05(月) 23:10:49.65 ]
あ、ちなみに ghc でコンパイルすれば問題なく実行できるから、詰んではないか

でも色々実験して勉強しようと思ってたんだが、ghci 使えないとなると、
かなり面倒になるなぁ・・・

291 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 23:12:17.93 ]
>>281-283
関手とはある圏の対象と射をもう一つの圏(自己関手の場合は同じ圏)に移すものだから、
Functorのインスタンスとfmapセットで関手と言うのが一番近い

292 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 23:37:08.23 ]
>>286=こいつ図星

こいつ>>285のレスに図星しすぎれレスしてやがる
だいたいのやつは必死に悔しくても反応したら負けっていう考え持ってるから食いつかない
こいつは食いついた正直者

293 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 23:41:21.48 ]
>>290
たぶんWindows固有の問題
LinuxかMacを使うとか、Windowsなら仮想マシン上でLinux使えば、問題が出ない可能性が高い
この手の開発はUnix系メインでやっててWindowsはオマケのことが多いから、
細かいとこで目の行き届かない不具合があったりする

294 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 23:41:35.04 ]
俺、Haskellぐらいしかまともに書ける言語ないんだが、
正直それはそれで非常に恥ずかしい思いをしている

295 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 23:41:49.81 ]
○○をしたら負けとか偉いやつが言ったらすぐ真似をして
○○をしなくなるのが情弱

Matzみたいなのが「これから来る言語」 Haskellとか言ったら
すぐ真似して
Haskellしだすやつが情弱

>>286=こいつ最高に図星



296 名前:デフォルトの名無しさん mailto:sage [2012/11/05(月) 23:44:42.21 ]
Haskellの話しようぜ

297 名前:289 mailto:sage [2012/11/05(月) 23:45:16.42 ]
>>293
ありがと

とりあえず勉強だけなら処理速度は要らないから、
vm player に linux 入れて、そっちでやってみるよ

298 名前:デフォルトの名無しさん mailto:sage [2012/11/06(火) 00:53:45.21 ]
実用度外視なんだから、偉いやつが言ったことをすぐ真似してHaskellやるのが正解
どうせネットで偉い人のマネする以上の教育課程が揃ってないんだから


299 名前:デフォルトの名無しさん mailto:sage [2012/11/06(火) 07:18:02.31 ]
教育してもらわなきゃプログラミングすら出来ないアホは
まったく向いてないからリアル土方に転向したほうが良いよ?

300 名前:デフォルトの名無しさん mailto:sage [2012/11/06(火) 07:31:54.96 ]
侮辱がただの賛意表明になっているような
元からそのつもりだったのか?
いや、そういう文体には見えないなあ
要するに>>299はアホなんだろう

301 名前:デフォルトの名無しさん mailto:sage [2012/11/06(火) 07:33:11.89 ]
え?まじで教育が必要なの?
大学でも別にプログラミングなんて独学だっただろ?

え?大学行ってないの?

302 名前:デフォルトの名無しさん mailto:sage [2012/11/06(火) 07:34:45.38 ]
俺が言いたいのは>>298>>299って同じ主張じゃね?
ってこと
ほんとに大学行ってるの?

303 名前:デフォルトの名無しさん mailto:sage [2012/11/06(火) 07:36:37.37 ]
>>298は「教育環境揃ってない = 実用度外視」
と書いてるようにしか読めんのだが
教育されなきゃ実用的なプログラミングも出来ないアホは向いてないよ

304 名前:デフォルトの名無しさん mailto:sage [2012/11/06(火) 07:41:52.94 ]
話通じてないなあ・・・
自分の発言にあとから留保つけちゃってるし
まあ俺は>>298じゃないからいいんだけどさ

305 名前:デフォルトの名無しさん mailto:sage [2012/11/06(火) 07:44:55.65 ]
アホが偉い人のマネすべきってのはその通りだな
自分で考える脳みそ無いし



306 名前:デフォルトの名無しさん mailto:sage [2012/11/06(火) 07:48:21.06 ]
GHCはRuby以下の安定性

307 名前:デフォルトの名無しさん [2012/11/06(火) 09:29:03.76 ]
   ∧_∧
   ( ´Д`) <みなさーん、お茶が入りましたよ〜
  /    \
  | l    l |     ..,. ., .,
  | |    | _|。.:_::゜。-.;.:゜。:.:;。
  ヽ \_ .。'゚/   `。:、`;゜:;.::.。:.:。
   /\_ン∩ソ\    ::..゜:: ゚。:.:.::.。.。:.
.  /  /`ー'ー'\ \  ゜: ::..゜:: ゚。:.:.:,。:.:.
 〈  く     / / ::..゜:: ゚。:.:.:,.:.:.:。:.:,
.  \ L   ./ / _::..゜:: ゚。:.:.:,.:.:,.:.:.:,
    〉 )  ( .::旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦.
   (_,ノ    .`ー'旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦.

308 名前:デフォルトの名無しさん mailto:sage [2012/11/06(火) 10:19:19.89 ]
298 名前:デフォルトの名無しさん[sage] 投稿日:2012/11/06(火) 00:53:45.21
実用度外視なんだから、偉いやつが言ったことをすぐ真似してHaskellやるのが正解
どうせネットで偉い人のマネする以上の教育課程が揃ってないんだから

305 名前:デフォルトの名無しさん[sage] 投稿日:2012/11/06(火) 07:44:55.65
アホが偉い人のマネすべきってのはその通りだな
自分で考える脳みそ無いし

309 名前:デフォルトの名無しさん mailto:sage [2012/11/06(火) 10:58:32.92 ]
Matzってそれほど「偉いやつ」だっけ

310 名前:デフォルトの名無しさん mailto:sage [2012/11/06(火) 14:23:00.82 ]
Perl忍者最近見ないな

311 名前:デフォルトの名無しさん mailto:sage [2012/11/06(火) 17:31:28.63 ]
>>261
じゃあfmap的なことはどう実現したらいいんですか!?

312 名前:デフォルトの名無しさん mailto:sage [2012/11/06(火) 18:24:59.42 ]
>>311
Data.Vector.Unboxed.map

313 名前:デフォルトの名無しさん mailto:sage [2012/11/06(火) 19:07:44.24 ]
>>312
(////)

314 名前:デフォルトの名無しさん mailto:sage [2012/11/06(火) 19:14:05.47 ]
(////) ::

315 名前:デフォルトの名無しさん mailto:sage [2012/11/06(火) 23:10:36.99 ]
(////) :: Answer -> Shame



316 名前:デフォルトの名無しさん mailto:sage [2012/11/08(木) 19:52:02.96 ]
質問です。Writerモナドというものを知ったので、前から知りたかった
遅延評価される場合のたらいまわし関数の呼び出され回数というものが知りたくて以下のように書きました。

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でカウントするのが無理だとしたらどうするのが定石でしょうか?

317 名前:デフォルトの名無しさん mailto:sage [2012/11/08(木) 20:03:07.81 ]
入門書のリスト内包表記にガードが使えるという下りを読んで、凄い衝撃を受けた。
もしかしてHaskellって、Prologよりも抽象度が高いのかも。

実際にプログラムを作るまでになれば、泥臭いこともいろいろあるんだろうけど。

318 名前:デフォルトの名無しさん mailto:sage [2012/11/08(木) 21:19:45.25 ]
>>316
関数の評価回数を知りたいだけでしたら、プロファイリングすれば簡単にわかりますよ。

コンパイル時に3つのオプション "-rtsopts -prof -auto-all" を付けて、
実行ファイルの起動時にRTSオプション "+RTS -p" を付ければ、
*.prof ファイルができるんで、それを読めばいいです。

prof ファイルの一番下の表を見てください。
1列目に関数名(変数も関数)、2列目にモジュール名とあって、
4列目の "entries" の項目が評価回数です。

例えば z を返すバージョンの tak 関数を使って、

main :: IO
main = do
&nbsp;&nbsp;let z = tak 3 2 1
&nbsp;&nbsp;print z

を上記のようにコンパイルして実行してできた prof ファイルを見ると、
tak の評価回数は 5 と表記されています。
(実際に手計算で let z = tak 3 2 1 を簡約すると、
確かに5回 tak 関数が評価されていることが確認できます)

プロファイリングの詳細は「本物のプログラマはHaskellを使う」
の第45回の記事を参考にしてください。

こういうことではなく、プログラムの中でカウントする仕組みを作るには、
という趣旨の質問でしょうか?

319 名前:デフォルトの名無しさん mailto:sage [2012/11/08(木) 21:33:42.67 ]
>>316 こうすればok
tak 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' ;変えた

320 名前:デフォルトの名無しさん mailto:sage [2012/11/08(木) 21:46:20.04 ]
>>316がやりたいのは"遅延評価された場合"だからWriterだとマズイかも

321 名前:デフォルトの名無しさん mailto:sage [2012/11/08(木) 21:46:32.28 ]
>>318
すみません、書き忘れました。
仰る通りプログラムの中でカウントする仕組みを作るには、という趣旨です。
>>319
それをやると遅延評価の場合と結果変わっちゃいませんかね?

322 名前:319 mailto:sage [2012/11/08(木) 21:57:07.69 ]
すいませんでした。orz
snd(runWriter(tak 100 50 0))とかやると糞時間かかりますね。
あとここちょっと違ってます。
 | x <= y = do
   tell(Sum 1)
   return y; 変えた

323 名前:319 mailto:sage [2012/11/08(木) 21:59:19.20 ]
ああごめん。>>322の最後は無視して。orz

324 名前:デフォルトの名無しさん mailto:sage [2012/11/08(木) 22:33:46.28 ]
>>316
Haskellは純粋だから、評価順序によって違う値を返す関数は書けない。遅延評価を前提とした呼び出し回数を数えるには、明示的に遅延評価をエミュレートする必要がある
import Control.Applicative
import Control.Monad.ST
import Data.STRef

thunk :: ST s a -&gt; ST s (ST s a)
thunk action = do
&nbsp; ref &lt;- newSTRef Nothing
&nbsp; return $ do
&nbsp; &nbsp; cache &lt;- readSTRef ref
&nbsp; &nbsp; case cache of
&nbsp; &nbsp; &nbsp; Just val -&gt; return val
&nbsp; &nbsp; &nbsp; Nothing -&gt; do val &lt;- action; writeSTRef ref (Just val); return val

tak :: STRef s Int -&gt; ST s Int -&gt; ST s Int -&gt; ST s Int -&gt; ST s Int
tak counter ex ey ez = do
&nbsp; modifySTRef counter (+1)
&nbsp; x &lt;- ex; y &lt;- ey
&nbsp; if x &lt;= y
&nbsp; &nbsp; then ey
&nbsp; &nbsp; else do
&nbsp; &nbsp; &nbsp; a &lt;- thunk $ tak counter (pred &lt;$&gt; ex) ey ez
&nbsp; &nbsp; &nbsp; b &lt;- thunk $ tak counter (pred &lt;$&gt; ey) ez ex
&nbsp; &nbsp; &nbsp; c &lt;- thunk $ tak counter (pred &lt;$&gt; ez) ex ey
&nbsp; &nbsp; &nbsp; tak counter a b c

takCount :: Int -&gt; Int -&gt; Int -&gt; Int
takCount x y z = runST (do
&nbsp; counter &lt;- newSTRef 0
&nbsp; _ &lt;- tak counter (return x) (return y) (return z)
&nbsp; readSTRef counter)

325 名前:324 mailto:sage [2012/11/08(木) 22:35:38.37 ]
あれ2chの仕様変わったの…
実体参照は適当に戻してね!



326 名前:デフォルトの名無しさん mailto:sage [2012/11/08(木) 22:36:17.95 ]
>< (//)

327 名前:デフォルトの名無しさん mailto:sage [2012/11/08(木) 22:53:32.55 ]
>>324
ありがとうございます、言い切ってもらえると参考になります。
今すごいH本をやっと読み終わろうかという段階なので正直難しいですが、
そのうち理解できるように精進します。

328 名前:デフォルトの名無しさん mailto:sage [2012/11/08(木) 23:43:06.04 ]
>>325
インデントは全角空白派が大勝利で悔しい
仕様変更の経緯のわかるスレとかあればどなたかプリーズ

329 名前:デフォルトの名無しさん mailto:sage [2012/11/09(金) 13:58:18.49 ]
ランタイムのGCっていつ行われるの?

アイドル時にやってくれる?

330 名前:デフォルトの名無しさん mailto:sage [2012/11/09(金) 18:56:23.67 ]
>>329
メモリが足りなくなったら

331 名前:デフォルトの名無しさん mailto:sage [2012/11/09(金) 19:22:04.75 ]
-threaded付けてるならアイドル時にもやる

332 名前:デフォルトの名無しさん mailto:sage [2012/11/09(金) 19:22:21.31 ]
>>330
今入力待ちで暇だなー……
あ、もう要らない領域あんじゃん
スカベンジスカベンジ……

こうはならないの?

333 名前:デフォルトの名無しさん mailto:sage [2012/11/09(金) 19:23:42.68 ]
>>331
あり^^

334 名前:デフォルトの名無しさん mailto:sage [2012/11/09(金) 21:15:13.21 ]
今日 -XTransformListComp なるものの存在を知ったんだけど
これって需要あるの?


{-# 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]

335 名前:デフォルトの名無しさん mailto:sage [2012/11/11(日) 15:48:20.65 ]
conduit-0.5.2.7 を使っています。

ライブラリドキュメントの 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 の評価結果を数値または数字で得る、
あるいは標準出力へ出力することができるでしょうか。



336 名前:355 mailto:sage [2012/11/11(日) 16:02:03.19 ]
>>355
これでできました。

a :: GSink () IO Int
a = sourceList [1..10] $$ fold (+) 0

main :: IO ()
main = do
 a <- runPipe a
 print a

なんか不親切なチュートリアルですね。
最初の sourceFile の例ではちゃんと runResourceT があるのに。

337 名前:335 mailto:sage [2012/11/11(日) 16:02:48.97 ]
すいません、レス番間違っていました。

>>335 です。

338 名前:デフォルトの名無しさん mailto:sage [2012/11/11(日) 18:20:04.17 ]
皆さんの思うハスケルの他の言語に対する優位性はなんですか?

339 名前:デフォルトの名無しさん mailto:sage [2012/11/11(日) 18:25:43.15 ]
conduit-0.5.4ならsourceList [1..10] $$ fold (+) 0で大丈夫だった
それよりWindowsのghc7.6.1ではghci上でconduitが使えないというのが気になる

340 名前:デフォルトの名無しさん mailto:sage [2012/11/11(日) 18:53:17.01 ]
>>339

>>289 >>290 >>293 辺り

341 名前:デフォルトの名無しさん mailto:sage [2012/11/11(日) 19:02:24.58 ]
>>339
7日に 0.5.4 が公開されていたんですね(その前日にDLしてました)

今 0.5.4.1 にアップデートして、
sourceList [1..10] $$ fold (+) 0 の値を print してみましたが、
コンパイルエラーでした。

大丈夫だったというのは、どのようにやったのでしょうか。

342 名前:デフォルトの名無しさん mailto:sage [2012/11/11(日) 19:07:49.53 ]
>>338 普段感じる利点はこのあたり
大域的な型推論
直和型が簡単に表現できる(CのunionやOOPLのsubtypeと比べて)
パターンマッチ(網羅性チェック、分岐と値の取り出しを同時に行える、など)
副作用のある箇所が型により分離される
(LLとかよりは)実行速度が速い

343 名前:デフォルトの名無しさん mailto:sage [2012/11/11(日) 19:10:49.18 ]
ほむほむ。

344 名前:341 mailto:sage [2012/11/11(日) 19:11:52.88 ]
>>339
あぁ、分かりました。

(sourceList [1..10] $$ fold (+) 0) >> print
こういう事ですね。
これならできました。

もしかして、これならアップデートしなくてもできていたかも知れません。


ところで、conduit を 0.5.2.7 から 0.5.4.1 へ
"cabal install conduit" でアップデートしたのですが、
ライブラリドキュメントの方はこれでは更新されないのでしょうか。
(デフォルトなら ・・・/AppData/Roaming/cabal/doc/index.html
にインストールされるものです)

ドキュメントの表記の方は 0.5.2.7 のままなんです。

345 名前:341 mailto:sage [2012/11/11(日) 19:18:31.91 ]
>>344
誤 (sourceList [1..10] $$ fold (+) 0) >> print

正 (sourceList [1..10] $$ fold (+) 0) >>= print


ライブラリドキュメントの方はトップの目次のところだけでなく、
内容も、例えば Data.Conduit のページの上部にも
"conduit-0.5.2.7: Streaming data processing library."
と書かれていて、更新されていません。

こういうものなのでしょうか。

Cabal のパッケージのバージョンは、
(規則に従うなら)4つ目の番号の変更は、
互換性は保っているがAPIが変更されている事になるので、
ドキュメントも変更しないとまずいような気がするのですが・・・



346 名前:デフォルトの名無しさん mailto:sage [2012/11/11(日) 20:02:42.53 ]
ghciで
λ> sourceList [1..10] $$ fold (+) 0
って入力しただけだけど 省略 >>= printと同じ事か

ドキュメンテーションが更新されないのは多分haddockのバージョンとghcのバージョンが違うから生成に失敗してるとかが考えられる

347 名前:341 mailto:sage [2012/11/11(日) 20:46:24.73 ]
>>346
> 省略 >>= printと同じ事か
なるほど、たしかに。


> 多分haddockのバージョンとghcのバージョンが違うから

haddock.exe は ghc 7.6.1 に元々入っているのですが、
これが違うという事でしょうか。

ちなみに、ghc の bin ディレクトリには haddock.exe とは別に、
haddock-7.6.1 という名前の謎のファイルもあります。
(バイナリエディタで見てみると、形は実行ファイルの様ですが)

どうも、ghc 7.6.1 は謎の挙動かちらほらとありますね・・・

348 名前:デフォルトの名無しさん mailto:sage [2012/11/11(日) 22:43:59.93 ]
インストールした直後にcabalでconduit入れた時になんかhaddockのバージョンがおかしいって警告出たから
cabal install haddockで入れなおしたらconduitのドキュメント作ってくれるようになった
これはcabal/binにhaddockがあるからそっちが優先されるのが原因だけど

349 名前:デフォルトの名無しさん mailto:sage [2012/11/12(月) 02:11:31.23 ]
>>342
Javaのような言語で書かれた業務アプリ、ドカタの世界にもこれから進出してきたりしますかね

350 名前:デフォルトの名無しさん mailto:sage [2012/11/12(月) 06:17:52.78 ]
>>349
早くて20年後ぐらいじゃね?

351 名前:デフォルトの名無しさん mailto:sage [2012/11/12(月) 20:15:17.94 ]
Javaで書かれた商用ソフト見たことがない
ハードについてるドライバは何度かある

352 名前:デフォルトの名無しさん mailto:sage [2012/11/12(月) 20:22:24.00 ]
>>351
俺はひとつだけ知ってる
astah*

Haskell で書かれた商用ソフトってあるんかな
うちは社内ツールではあるけど

353 名前:デフォルトの名無しさん mailto:sage [2012/11/12(月) 20:29:59.56 ]
そういえばperlやjavascriptで書かれた商用ソフトも見たこと無いな。

354 名前:デフォルトの名無しさん mailto:sage [2012/11/12(月) 20:33:15.19 ]
コンパイルできない言語ってソースをそのまま売ることになると思うけど、それって商売になるのだろうか

355 名前:デフォルトの名無しさん mailto:sage [2012/11/12(月) 20:37:06.13 ]
ソースを売れっていうのは普通にあるでしょ



356 名前:デフォルトの名無しさん mailto:sage [2012/11/12(月) 20:43:17.14 ]
Android 用有料アプリは Java で書かれた商用ソフトである
という認識でいいのか?

357 名前:341 mailto:sage [2012/11/12(月) 22:44:21.87 ]
>>348
Haddock を cabal install で入れてから、
cabal install --reinstall Conduit してもダメでした。
(ghc\bin ディレクトリより cabal\bin ディレクトリの方が
優先的に検索されるように設定しましたが・・・)

cabal\bin の Haddock.exe を ghc\bin へコピーしてみましたがダメでした。

よく見たら、cabal\doc 内には conduit-0.5.2.7 と conduit-0.5.4.1 があったので、
conduit-0.5.2.7 の方を適当にリネームして、index.html もリネームし、
この状態で cabal install --reinstall Conduit してみたら、
ドキュメントの目次やコンテンツの Conduit のバージョンが
ちゃんと 0.5.2.7 に更新されました。

Haddock の更新は必要条件だったのかよく分かりませんが、
とりかくドキュメントが正しく更新できて良かったです。

お騒がせしました。

358 名前:デフォルトの名無しさん mailto:sage [2012/11/13(火) 20:32:21.56 ]
>>351
Minecraft

359 名前:デフォルトの名無しさん mailto:sage [2012/11/14(水) 13:53:30.81 ]
何だよ
type family Mutable v :: * -> * -> *
Mutable v s a is the mutable version of the pure vector type v a with the state token s
って
リワハじゃ習わなかったぞ

360 名前:デフォルトの名無しさん mailto:sage [2012/11/14(水) 15:21:27.75 ]
トップレベルの関数の型宣言で
Unbox a => ……としたとして
letやwhereと続けた内部関数にも型宣言をつけるとします

このとき、その宣言でもトップレベルの a と同じ型を指定する為にはどうしますか?

361 名前:デフォルトの名無しさん mailto:sage [2012/11/14(水) 18:30:25.04 ]
関数を生成する関数 :: Unbox a => 内部関数の型 -> トップレベル関数の型
トップレベル関数 = 関数を生成する関数 内部関数 where 内部関数 = …

362 名前:デフォルトの名無しさん mailto:sage [2012/11/14(水) 19:30:01.00 ]
>>360
Lexically scoped type variables の事かな

363 名前:デフォルトの名無しさん mailto:sage [2012/11/19(月) 07:06:57.78 ]
関数内使わないほうが読みやすく感じる
whereって必要ですか?

364 名前:デフォルトの名無しさん mailto:sage [2012/11/19(月) 07:07:41.13 ]
s/関数内/関数内の関数定義/

365 名前:デフォルトの名無しさん mailto:sage [2012/11/19(月) 07:37:36.32 ]
さすがに一時束縛なしはハードモードでないの? letのほうが読みやすいということもあまりないでしょう



366 名前:デフォルトの名無しさん mailto:sage [2012/11/19(月) 08:06:27.68 ]
関数内関数は自由変数が多くて理解するのが難しいです
トップレベルの関数に持ち上げてしまって、モジュールの機能で外部からは隠して、
自由変数になっていたところは明示的に引数として渡すほうが良いのではないかと

367 名前:デフォルトの名無しさん mailto:sage [2012/11/19(月) 08:09:12.81 ]
ケースバイケースなんで
whereが要る要らないの話にはならないと思う

368 名前:デフォルトの名無しさん mailto:sage [2012/11/19(月) 08:13:31.56 ]
それはね、長い関数が読み難いだけなんだよ

369 名前:デフォルトの名無しさん mailto:sage [2012/11/19(月) 18:06:19.91 ]
自由変数の追いにくさと引数渡しの煩雑さを天秤に掛けた結果、
多くの人はwhereを大量に使うことを選択している
何を読み難いと感じるかは個人差が大きいから、
多数派と違う感性を持ってると生きづらいね

という結論が嫌なら、「読みやすく感じる」よりも客観的な論拠を挙げてください

370 名前:デフォルトの名無しさん mailto:sage [2012/11/20(火) 00:03:10.08 ]
プログラムは書くことより読むことのほうが難しいし読むことの方が多い
whereはプログラムを書きやすくできるが読みにくくする
whereを使うのは甘え

371 名前:デフォルトの名無しさん mailto:sage [2012/11/20(火) 06:58:26.14 ]
>>366
関数内のスコープに限定するより
モジュール内スコープに広げた方が読みやすい?
頭大丈夫?

372 名前:デフォルトの名無しさん mailto:sage [2012/11/20(火) 07:07:32.45 ]
>>370
頭の中で、読みにくいコードを読みやすいコードに書きかえればいいだろ
それができる人は読むことより書くことが多い

373 名前:デフォルトの名無しさん mailto:sage [2012/11/20(火) 07:38:40.46 ]
>>363
末尾再帰覚えてない人かな?
where使わず書いたら、引数の数が違うだけで同じ機能の関数が沢山出来上がってしまう

sum ns = sum' ns 0
where
sum' [] v = v
sum' (n:ns) v = sum' ns (n + v)

whereが無ければsum関数とsum'関数の両方が関数を使う側に公開されるか、末尾再帰関数作る度にモジュール書き換えが必要になる

374 名前:デフォルトの名無しさん mailto:sage [2012/11/20(火) 08:10:24.50 ]
sum ns = let sum' [] v = v
sum' (n:ns) v = sum' ns (n + v)
in sum' ns 0

375 名前:デフォルトの名無しさん mailto:sage [2012/11/20(火) 09:16:11.00 ]
>>372
君、仕事でプログラム書いたことないでしょ?



376 名前:デフォルトの名無しさん mailto:sage [2012/11/20(火) 09:29:43.91 ]
どっちも同じだと思えば両方読めるようになるのに、ノイズが気になって読めない
ノイズが少ない方が優れているといってノイズばかり見ている

雑音を無視したら優劣の概念がなくなってしまう
優劣を気にするとデジタルが読めなくなる

377 名前:デフォルトの名無しさん mailto:sage [2012/11/20(火) 09:57:34.35 ]
仕事でHaskell使った事ないわーw

378 名前:デフォルトの名無しさん mailto:sage [2012/11/20(火) 14:25:22.30 ]
そもそも、お前がいう「仕事」って、受注開発(の賃金労働)のことだろ?
自分で作ったサービスで始める仕事(ビジネス)だったら、言語はなんだっていいんだよ。
ドヤ顔で「仕事でhaskell使ったことないわ」とか恥ずかしすぎるわw

379 名前:デフォルトの名無しさん mailto:sage [2012/11/20(火) 14:26:08.12 ]
会社に小遣いもらってる分際が偉そうに、と思うね。

380 名前:デフォルトの名無しさん mailto:sage [2012/11/20(火) 14:45:50.00 ]
仕事で戦車使ったことないわ

381 名前:デフォルトの名無しさん mailto:sage [2012/11/20(火) 15:35:16.08 ]
ああ、Haskellerってこういうのばっかなのね

382 名前:デフォルトの名無しさん mailto:sage [2012/11/20(火) 16:26:57.23 ]
まだ平和な方のスレですよ

383 名前:デフォルトの名無しさん mailto:sage [2012/11/20(火) 18:16:34.72 ]
>>366
トップレベルにリフトすれば自由変数が減るかのような錯覚はどこからきた?

384 名前:デフォルトの名無しさん mailto:sage [2012/11/20(火) 18:21:28.91 ]
さすがに>>378-379は引くわ

385 名前:デフォルトの名無しさん mailto:sage [2012/11/20(火) 18:30:03.16 ]
関西型プログラミング言語



386 名前:デフォルトの名無しさん mailto:sage [2012/11/20(火) 18:49:25.20 ]
なんでやねん

387 名前:デフォルトの名無しさん mailto:sage [2012/11/20(火) 22:50:08.77 ]
Haskell使う案件ってどこに行けばあるんだろうな。

388 名前:デフォルトの名無しさん mailto:sage [2012/11/20(火) 23:02:02.53 ]
Haskell を使う事案が発生しました

389 名前:デフォルトの名無しさん mailto:sage [2012/11/21(水) 01:14:53.06 ]
>>387
大学

390 名前:デフォルトの名無しさん mailto:sage [2012/11/21(水) 07:23:50.52 ]
>>387
実際にどのような仕事があるか知らんが、
君には "haskell commercial OR industry" でググる知恵はないのか

391 名前:デフォルトの名無しさん mailto:sage [2012/11/21(水) 09:17:06.66 ]
ちえをくれ

392 名前:デフォルトの名無しさん mailto:sage [2012/11/22(木) 02:43:01.30 ]
おいおい、haskell使った仕事が貰えないなら、
自分で始めればいいだけだろ。
仕事を作るのも仕事のうち。

393 名前:デフォルトの名無しさん mailto:sage [2012/11/22(木) 06:04:12.01 ]
ま、自分が知らないからって無いで押し切るのは
一つの生き方ではあるわな

394 名前:デフォルトの名無しさん mailto:sage [2012/11/22(木) 07:38:46.45 ]
>>392
いや、維持保守を引き継ぐ人たちがHaskell使えないのに
Haskellのソースを残すわけには行かないだろ。

395 名前:デフォルトの名無しさん mailto:sage [2012/11/22(木) 09:54:55.62 ]
Cに変換して納品








[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<103KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef