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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
2デフォルトの名無しさん:2012/06/27(水) 10:25:01.40
関連書籍
・Introduction to Functional Programming Using Haskell (2nd ed.)
 ttp://www.amazon.co.jp/exec/obidos/ASIN/0134843460/

・Haskell: The Craft of Functional Programming
 ttp://www.amazon.co.jp/exec/obidos/ASIN/0201342758/

・The Fun of Programming
 ttp://www.amazon.co.jp/exec/obidos/ASIN/0333992857/

・The Haskell School of Expression: Learning Functional Programming Through Multimedia
 ttp://www.amazon.co.jp/exec/obidos/ASIN/0521644089/

・入門Haskell
 ttp://www.amazon.co.jp/exec/obidos/ASIN/4839919623/

・ふつうのHaskellプログラミング
 ttp://item.rakuten.co.jp/book/4052963/

・Programming in Haskell
 ttp://www.amazon.co.jp/exec/obidos/ASIN/0521692695/

・Real World Haskell
 ttp://www.amazon.co.jp/exec/obidos/ASIN/0596514980

・関数プログラミングの楽しみ
 ttp://www.amazon.co.jp/exec/obidos/ASIN/4274068056

・すごいHaskellたのしく学ぼう!
 ttp://www.amazon.co.jp/dp/4274068854
3デフォルトの名無しさん:2012/06/27(水) 10:28:42.02
関連リンク
・GHC Wiki
 ttp://hackage.haskell.org/trac/ghc/wiki/TitleIndex

・A History of Haskell
 ttp://research.microsoft.com/en-us/um/people/simonpj/papers/history-of-haskell/

・関数型関連の用語集
 ttp://sky.zero.ad.jp/~zaa54437/programming/concepts/

・本物のプログラマはHaskellを使う
 ttp://itpro.nikkeibp.co.jp/article/COLUMN/20060915/248215/?ST=ittrend

・Haskell API search Engine
 ttp://www.haskell.org/hoogle/

 【簡単な使い方】
 1.検索バーに関数名を入れて検索
  例 map
 2.検索バーに型名を入れて検索
  例 (a -> b) -> [a] -> [b]

・Real World Haskell
 ttp://book.realworldhaskell.org/read/

・Learn You a Haskell for Great Good!
 ttp://learnyouahaskell.com/chapters
4デフォルトの名無しさん:2012/06/27(水) 10:29:12.57
はじめてのCとか(´・ω・`)
すごいHとか(´・ω・`)

なんなの男の子って(´・ω・`)
5デフォルトの名無しさん:2012/06/27(水) 10:30:18.46
関連書籍 つづき

・Haskell: The Craft of Functional Programming (3rd ed.)
 ttp://www.haskellcraft.com/craft3e/Home.html
 ttp://www.amazon.co.jp/dp/0201882957/

・Learn You a Haskell for Great Good!
 ttp://learnyouahaskell.com/
 ttp://www.amazon.co.jp/dp/1593272839/
6デフォルトの名無しさん:2012/06/27(水) 13:08:30.50
H本、俺も欲しくなってきた (*´д`)
7デフォルトの名無しさん:2012/06/27(水) 13:50:58.03
■ C
for( const char *s="12345"; *s; ++s ) if( '2'<*s&&*s<'5' ) printf( "%d", (*s-'0')*2 );
■ JavaScript
console.log([1,2,3,4,5].filter(function (i){ return i > 2 && i < 5 ; }).map(function(i){ return 2 * i; }));
■ Python
print(map(lambda x: x*2, filter(lambda x: x>2 and x<5, [1,2,3,4,5])))
■ Ruby
puts [1,2,3,4,5].select{|i| i > 2 and i < 5}.map{|i| i*2}
■ C#
new{}{ 1,2,3,4,5 }.Where(x => 2 < x && x < 5).Select(x => x*2);
■ Common Lisp
(print (loop for x in '(1 2 3 4 5) if (< 2 x 5) collect (* x 2)))
■ Haskell
print [x*2| x <-[1,2,3,4,5], x > 2, x < 5]
8デフォルトの名無しさん:2012/06/27(水) 14:45:19.68
すごいH、アマゾンで注文したけど、なかなか発送こない
9デフォルトの名無しさん:2012/06/27(水) 19:09:59.42
Haskellに貢献した偉大な人物 Oberin開発者 Glenn Seemann氏

OS9時代にHyper Cardなどでゲームを作成

Mac Games
http://www.glennsgames.com/
Oberin
http://oberin.com/
その他、DSなど様々なゲームを手がけるプログラマ
仕事の片手間でUOライクオンラインゲームを作り出す腕前

オライリー本も出版
ゲーム開発者のためのAI入門 [大型本] ★★★★★ 高評価
David M. Bourg (著), Glenn Seemann (著), 株式会社クイープ (翻訳)
http://www.amazon.co.jp/%E3%82%B2%E3%83%BC%E3%83%A0%E9%96%8B%E7%99%BA%E8%80%85%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEAI%E5%85%A5%E9%96%80-David-M-Bourg/dp/4873112168


ここまでテンプレ
10デフォルトの名無しさん:2012/06/27(水) 22:46:13.86
どうして>>7のPythonは
print [x * 2 for x in range(1, 5) if 2 < x < 5]
ではないのですか?
11デフォルトの名無しさん:2012/06/27(水) 22:46:59.61
>>10
無能なruby厨uyの悪意です
12デフォルトの名無しさん:2012/06/27(水) 23:02:28.58
>>10
どうしてpython2なのですか?
13デフォルトの名無しさん:2012/06/27(水) 23:44:17.19
>>12
単に自分が未だに2を使ってて、癖が抜けないってだけです
14デフォルトの名無しさん:2012/06/28(木) 00:43:30.80
>>7
■ Perl
print map {$_*$_} grep {2<$_ and $_<5} 1..5;
15デフォルトの名無しさん:2012/06/28(木) 00:55:39.50
>>7
短く書くことでプログラムが分かりやすくなるから短く書くというのなら理解できるんだけど、
C言語のヤツみたい分かりにくくしてまで短く書く理由って何なの?
算術演算なのに int で定義しない理由を知りたい
16デフォルトの名無しさん:2012/06/28(木) 01:39:52.96
int i, x[]={1,2,3,4,5};
int n = sizeof(x)/sizeof(x[0]); // 配列の要素数
for(i=0; i<n; i++) { if( (x[i]>2) && (x[i]<5) ) printf(" %d", x[i]*2); }
17デフォルトの名無しさん:2012/06/28(木) 02:57:12.58
>>12
そもそも>>7はPython2.6だし
18デフォルトの名無しさん:2012/06/29(金) 00:07:43.08
>>7
■ Ruby
puts [1,2,3,4,5].select(&(2..5).method(:cover?)).map(&2.method(:*))
19デフォルトの名無しさん:2012/06/29(金) 00:10:54.81
python3の失敗を忘れてはならない
20デフォルトの名無しさん:2012/06/29(金) 00:31:33.12
>>15 ワンライナーの比較だからじゃね
21デフォルトの名無しさん:2012/06/29(金) 02:22:01.14
>>20
Cはインデント必要ないから、マクロ以外は全部ワンラインにできると思う
22デフォルトの名無しさん:2012/06/29(金) 02:45:52.41
C使いは一時変数やカンマ式やビットシフトを無闇に使ってしまい
式の美しさを追及しない傾向があるからねー
母数が多くダラダラコードが目に付きやすいってのがあるかもしれんけど
23デフォルトの名無しさん:2012/06/29(金) 02:50:57.59
いいかげん他言語の話はやめれ。
24デフォルトの名無しさん:2012/06/29(金) 02:56:53.94
コードは美しくなくていい
頭を使わず読めて、一目で正しさを実感できるコードが良いコード
25デフォルトの名無しさん:2012/06/29(金) 04:42:50.35
import Control.Monad.Par.Class
import Control.DeepSeq

このどちらにもNFData クラスがあり
この両方をインポートするソースファイルをコンパイルしても
コンパイラは両者が同一の物を指すのだと突き止め
曖昧性などないのだと断定する筈です

というのはこの辺のことがリワハの601ページに

> Haskell標準によれば、Haskellの処理系は、
> 複数の名前が同じ「もの」を指していることがわかる能力を持たなければなりません。

との記述があるからです

しかし
Ambiguous occurrence `NFData'
It could refer to either `Cotrol.DeepSeq.NFData',
             imported from Control.DeepSeq at Cotrol\Monad\Par\AList.hs:28:1-22
           or `Class.NFData',
             imported from Control.Monad.Par.Class at Cotrol\Monad\Par\AList.hs:33:1-30


以上はmonad-par-extras-0.3.2 をビルドする途中で出ました

何が起こったのでしょうか?
26デフォルトの名無しさん:2012/06/29(金) 04:55:36.11
正しくは
deepseq-1.3.0.0 パッケージの Cotrol.DeepSeq モジュールの NFData を
abstract-par-0.3.1 パッケージの Control.Monad.Par.Class モジュールで再エクスポートしているようです

両モジュールを monad-par-extras-0.3.2 の AList.hs が全部インポートしているのですね
27デフォルトの名無しさん:2012/06/29(金) 07:04:46.00
>>24
俺はそのようなコードこそ美しく感じる
28Prolog工作員:2012/06/29(金) 07:59:47.13
>>27 >>24
Prologを勧めます。
29デフォルトの名無しさん:2012/06/29(金) 11:49:54.48
>>24
コードが美しいってそういう意味じゃないの?
芸術的な意味で美しいなんていってるやつはいないだろ
30デフォルトの名無しさん:2012/06/29(金) 12:04:40.53
僕には理解できないコード=美や技巧に走ったコード
というケースが多いのが問題なのです。
31デフォルトの名無しさん:2012/06/29(金) 12:05:41.21
まずは芸術的な意味を定義しましょう
32デフォルトの名無しさん:2012/06/29(金) 12:10:14.71
抽象画と具象画から議論するか
33デフォルトの名無しさん:2012/06/29(金) 12:30:16.66
芸術とは爆発だ
34デフォルトの名無しさん:2012/06/29(金) 12:35:20.43
人が作ったとは思えない美しさというのがある
それは誰かが意図的に読みやすくしたり逆に読みにくくしたものではない
35デフォルトの名無しさん:2012/06/29(金) 20:11:41.09
昔、絵描きやってる知り合いに、プログラマとか理解できない「このコードは美しい」とか言ってんのマジ気持ち悪い、とか言われたな…。
36デフォルトの名無しさん:2012/06/29(金) 20:23:25.56
重要なのはコードじゃなくて式の美しさだよバカ
37デフォルトの名無しさん:2012/06/29(金) 20:25:36.84
だから何?

数学ができない奴が、数学者の美意識をバカにしたところで、
そいつがバカなだけ。それと同じ。
38デフォルトの名無しさん:2012/06/29(金) 20:29:14.29
現代絵画なんてプログラマよりニッチな市場しかないのある。
39デフォルトの名無しさん:2012/06/29(金) 20:31:23.10
そういえば2年くらい前、Haskell初めて間もない頃はJavaプログラマから「Haskellってアレだろ?クイックソートを分け解らん式で書いて美しいとか悦に浸ってる言語」とか言われたな…。
まぁ当時は俺もアレの何が素晴らしいのか全く理解できなかったが。
40デフォルトの名無しさん:2012/06/29(金) 23:46:48.51
>>30
理解できないコードなら逆に問題ない
「汚いから作り治せ」でOK

理解はできるが、一瞬「うん?」と引っかかるコードが一番腹が立つ

作った方は毎週1個の日曜パズルのつもりかも知れんが、こっちは毎日数万ステップのレビューしてるんだから、そんなのコードが連続してたら殺意がわく
41デフォルトの名無しさん:2012/06/29(金) 23:49:03.04
>>37
数学において式は文の一部でしかない
式の美しさと論理の簡潔さを混同する人間は数学者ではない
42デフォルトの名無しさん:2012/06/29(金) 23:51:07.98
シュレティンガーの波動方程式は美しいの?
43デフォルトの名無しさん:2012/06/29(金) 23:59:30.34
>>42
表現が過不足なく内容を表現していてそれ以上は簡潔にできない、という意味なら美しい
44デフォルトの名無しさん:2012/06/30(土) 00:00:42.16
>>40
お前のアホっぽいレスも同様の代物と知れ。
45デフォルトの名無しさん:2012/06/30(土) 00:24:46.61
Simple is beautiful.
46デフォルトの名無しさん:2012/06/30(土) 01:08:37.58
すごいH超いいわこれ
どのくらいすごいかって言うと
PinH三日で挫折した俺がこの本なら一週間で読破できそうなレベル
47デフォルトの名無しさん:2012/06/30(土) 01:10:14.05
だからいいって言ったじゃん
48デフォルトの名無しさん:2012/06/30(土) 01:13:27.24
>>46
3週間家にこもってRWHを読破した後だと内容が軽すぎる
49デフォルトの名無しさん:2012/06/30(土) 01:29:12.76
ふつうのH → RWH(挫折) → すごいH → 関数プログラミングの楽しみ → RWH(再挑戦)

の順序が一番おすすめ
50デフォルトの名無しさん:2012/06/30(土) 01:36:01.55
やさしい Haskell 入門(完全に挫折) -> The Craft of Functional Programming -> モナドのすべて(挫折) -> Real World Haskell -> 関数プログラミングの楽しみ -> Arrowの論文 (イマココ)
51デフォルトの名無しさん:2012/06/30(土) 02:02:50.42
Haskellの文法の簡潔さを実感するには、2次元配列を使う数値計算の例題が一番ふさわしい
しかしオーバーフローにビビってるのか、数値計算と行列演算はHaskell入門書では亜流
52デフォルトの名無しさん:2012/06/30(土) 05:20:21.59
今日からxmonadを使うだけの人になります
これだけは代わりがない
53デフォルトの名無しさん:2012/06/30(土) 07:11:59.56
プログラミングHaskell(モナドで挫折)->ふつうのH(モナドで挫折)->RWH(挫折)->RWH(モナドで挫折)->RWH(わかった気になる)->RWH(モナドで挫折)->ある日モナドを悟る->RWH->すごいH
54 ◆QZaw55cn4c :2012/06/30(土) 07:51:57.22
ここまでにプログラミングHは列挙されない。やっぱり悪いのか?
55デフォルトの名無しさん:2012/06/30(土) 09:26:10.56
モナドを悟る->物欲を持て余す->おじいちゃんさっき悟ったばかりでしょ

なぜなのか
56デフォルトの名無しさん:2012/06/30(土) 12:14:26.25
つまらないスレだな
生産性0
何も生み出せない
ゴミクズ
早く死ねよ
プログラミングやってる者同士馴れ合ってるだけじゃねーか
つまんねーから
わかったか?
死ね
まあお前らががんばってもGoogle以下だよね
ゴミクズだな
なんか驚くもの作ってみろよ
レゴとかドラクエ風マップとか
つまんねーやつばっかりだな
モテなさそう
57デフォルトの名無しさん:2012/06/30(土) 12:27:10.31
> レゴとかドラクエ風マップとか

貧弱な発想にクッソワロタwww
58デフォルトの名無しさん:2012/06/30(土) 12:49:52.21
>>56
Rubyスレにお帰りください
Ruby初心者スレにはこなくてもいいです
59デフォルトの名無しさん:2012/06/30(土) 13:03:53.05
今ならminecraftクラシックもどき作るだけでも大絶賛されると思うのでやれる人は是非やって欲しい
なにせライバルがpongのようなデモゲーム、nikki robot(クソゲー)とかlambda cube(ゲームですらない)ぐらいしかいないので
60デフォルトの名無しさん:2012/06/30(土) 13:06:55.33
あれ、Haskellでマリオやグラディウスなかったっけ
61デフォルトの名無しさん:2012/06/30(土) 13:14:25.39
そういえばモナディウスとnarioがあったか
narioは多分今のghcでは動かない
62デフォルトの名無しさん:2012/06/30(土) 13:32:21.13
fragっつうFPSもあるよっ
63デフォルトの名無しさん:2012/06/30(土) 14:06:40.89
>>60 名前:デフォルトの名無しさん[sage] 投稿日:2012/06/30(土) 13:06:55.33
あれ、Haskellでマリオやグラディウスなかったっけ

っで?fragみた
別にHaskellでやることじゃねーよなあ?なんなんだ?
結局Haskellで作ってスゲーってのりじゃん?意味がわかんねー
ベスプラティクスってわかる?ゲーム作るのに何でHaskellで作ってるの?w
無理やりHaskellでゲームも作れるみたいにこじつけないでくれよなあwww強引すぎるよなあ?
だからお前はゴミクズなんだよなあw死ねよ シュシュ

>>60 名前:デフォルトの名無しさん[sage] 投稿日:2012/06/30(土) 13:06:55.33
あれ、Haskellでマリオやグラディウスなかったっけ

っで?あったとしてもそんなのほかの言語でてるだろ?
くだらねーwゲームでもゴミクズなHaskellどの言語でもゲームなんて作れるんじゃねーのw
無理やりこじつければなwPerlでゲーム、Rubyでゲームとかw
まじバッカーーーーーーーーーーwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
ゴミクズさんはHaskellやってないでためになることやってくださいよねええwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwきめえんだよなあ?wwwwwwwwwなにがモナドだよなあ?wwwwwwwwwww
しねぇwwwwwwwwwしねっ

>>59 名前:デフォルトの名無しさん[sage] 投稿日:2012/06/30(土) 13:03:53.05
今ならminecraftクラシックもどき作るだけでも大絶賛されると思うのでやれる人は是非やって欲しい
なにせライバルがpongのようなデモゲーム、nikki robot(クソゲー)とかlambda cube(ゲームですらない)ぐらいしかいないので

たしかになあwwwwwwwww
プライドがあるんだろうなwww
真似したらいけないっていう日本のプライドがなあwww
それか開発する技術力がねーだけだろうなあwwww
64デフォルトの名無しさん:2012/06/30(土) 14:09:55.65
OpenGLバインドがあるから、サウンド関係を無視すれば基本的に何でも作れる
むしろ、DSLとしてHaskellでゲーム作って、実装を他言語にトランスレートするのが通だと思う
65デフォルトの名無しさん:2012/06/30(土) 14:22:27.05
>>63
> ベスプラティクス
ベストプラクティスって言いたかったんですね。わかります
ちなみに漏れがレスしたのは>>59であって>>56ではありません
66デフォルトの名無しさん:2012/06/30(土) 14:24:23.41
Haskellで何も書けない部外者が
見当違いの意見を書くスレですか?
67デフォルトの名無しさん:2012/06/30(土) 15:37:16.75
なにか嫌なことでもあったんでしょ
68デフォルトの名無しさん:2012/06/30(土) 18:21:23.69
お前ら本当にゴミ
なあ?
Haskellとかしょべーんだよ
セキュリティ系のハッカーみたいにかっこよくて凄いわけじゃない

クラッカーみたいに悪ぶってもない

なんかゲーム作るやつとか凄いソフト作るやつみたいに
驚きも与えてくれない

お前らは何も生み出せないゴミ
ただの言語学者
ゴミ
69デフォルトの名無しさん:2012/06/30(土) 18:34:30.23
そうだねPolyKinds、DataKind、PromotionもAgdaのuniverse polymorphismの超劣化だし
Singletonもc++のライブラリであるBoost.Fusionが10年以上前に歩いた道だし
実用を捨てた研究用言語としても遅れてる感が否めないよね
70デフォルトの名無しさん:2012/06/30(土) 18:45:24.36
同じロジック(haskellのソース)でいろんな言語(機械語)のツールを自動生成できるから、クラッカー向きだと思うが
71デフォルトの名無しさん:2012/06/30(土) 19:04:03.72
>>63
> 別にHaskellでやることじゃねーよなあ?なんなんだ?

まさにそれが楽しいんだよ。
「それまでの普通」ではない事に挑戦するのが面白い。

また frag なんかは、 FRP が研究からゲームという結果へ結びついたという面でもあり、
素晴らしいことなんだよ。
72デフォルトの名無しさん:2012/06/30(土) 19:38:14.42
fragとかどう見てもQuake以下だがw
車輪の再発明乙wwなにがしたんですかねww

あなたたちの目的はなんですかねえwww
ないんですかねえ?w
何がしたいのかさっぱりですよww
ええww
73デフォルトの名無しさん:2012/06/30(土) 19:51:32.40
uyの頭はひどく悪い
ということだな

おk把握
74デフォルトの名無しさん:2012/06/30(土) 19:55:47.35
誰が言ったか忘れたけど
静的型付けが役に立たないことを確認するという目的もある
75デフォルトの名無しさん:2012/06/30(土) 19:58:22.73
誰が言ったか忘れた = 俺の脳内妄想
76デフォルトの名無しさん:2012/06/30(土) 23:13:18.06
>>68
セキュリティ系のハッカーがかっこいいってどんな価値観だよ。
厨二病にも程があるだろ
77デフォルトの名無しさん:2012/06/30(土) 23:15:14.06
触るなよ
大きくなっちゃうだろ
78デフォルトの名無しさん:2012/06/30(土) 23:19:26.51
fragがQuakeII相当をわずか43ファイル(空白/コメント含む)10Kstep以下で実装してしまったという事実は
行数=仕事量の考えが染み着いてるIT土方にとって脅威でしかないからパニックになるのもしかたないな
79デフォルトの名無しさん:2012/06/30(土) 23:57:33.50
>>72
DSL(Haskellコードの一部)から他言語へのトランスレート
つまり、自動プログラミングをやりたい
80デフォルトの名無しさん:2012/07/01(日) 00:09:09.37
>>74
他人のコードを読むときと1年くらい後にコードを読むときに物凄く役に立つと思います
81デフォルトの名無しさん:2012/07/01(日) 02:11:59.35
他人の目を気にしすぎ
しかも縁もゆかりもない赤の他人のために神経を使ってる感じ
82デフォルトの名無しさん:2012/07/01(日) 05:07:28.61
何言ってんだこいつ
83デフォルトの名無しさん:2012/07/01(日) 05:58:53.61
不毛だからHaskellの話しよーぜ!
84デフォルトの名無しさん:2012/07/01(日) 09:24:00.59
FRPっていつ勉強すればいいの?
リワハ済んだだけの若造にはまだ早い?
85デフォルトの名無しさん:2012/07/01(日) 09:49:33.36
FRPって y = f x を getY = do{x<-getX; return (f x)} にすればいいのか?
86デフォルトの名無しさん:2012/07/01(日) 12:33:40.07
>>85
質問の内容と意図がいまひとつ分らない。

もう少し詳しく話してくれないか。
どういった状況において FRP をどう利用しようとしていて、
どういった文脈でそのコード片が出てくるのか。

少なくともそれくらいは離してくれないと、何ともレスしようがない。
87デフォルトの名無しさん:2012/07/01(日) 13:00:07.17
>>84
RWH読んだなら十分
使うライブラリによってはApplicativeやArrowの知識が要ることがあるけど、
それは必要に応じてやればいい
88デフォルトの名無しさん:2012/07/02(月) 15:21:02.06
THとかFRPとかIterateeとかみんな使ってるの?
89デフォルトの名無しさん:2012/07/02(月) 15:38:37.38
そもそも誰もhaskellなんて使ってない
似非ハッカーが弄ってるだけの実用性0のオナニー言語
90デフォルトの名無しさん:2012/07/02(月) 15:48:07.35
まずい似非だなあ
91デフォルトの名無しさん:2012/07/02(月) 16:28:58.97
IOを使うより使わないほうがいい
THを使うより使わないほうがいい

後の禅オブHaskellである
92デフォルトの名無しさん:2012/07/02(月) 17:04:34.12
難しいもの=ハッカー
とか勘違いしてる馬鹿がいるね
93デフォルトの名無しさん:2012/07/02(月) 17:33:14.38
Iteratee系のライブラリは結構使われてるんじゃね
遅延IOはハンドル閉じるのが難しいっつー切実な問題があるからなぁ
94デフォルトの名無しさん:2012/07/02(月) 20:04:29.45
>>92
ハッカー=弱い型
と勘違いしてる京都の社長さんもいたねぇ
95デフォルトの名無しさん:2012/07/02(月) 20:40:03.33
発火!
96デフォルトの名無しさん:2012/07/02(月) 21:17:36.28
「Haskell信者」にその素晴らしさを熱く語られたときの平和で適当なかわし方
http://cielquis.net/religion/results/2cf68ea14896ef51940cdc3dbfe96ed5a1084ccd.html
97デフォルトの名無しさん:2012/07/02(月) 21:49:34.66
>>89
断言するが、ハッカーしか使えない言語は有害
98デフォルトの名無しさん:2012/07/02(月) 21:59:54.13
お前らがHaskellやっててもかっこいいと思わないよ シュシュシュ
知的優位立ちたがるためにHaskellやってんだろ???シュシュ
一般的名プログラミング言語をやってるやつに対して

キモヲタ「関数型プログラミング言語って知ってる?(ドヤッ)」
人間君「うむむむ」

っで知的優位に立ちたがる
マジゴミだな
なあ?出せー世お前シュシュ

お前らゴミクズよりなんかセキュリティハッカーのほうがまじすげーよ
お前らはゴミ
実用性にかける
面白みもない派手さにかける
カス
99デフォルトの名無しさん:2012/07/02(月) 22:00:25.21
お前らは微生物以下の存在
100デフォルトの名無しさん:2012/07/02(月) 22:01:38.73
コミュニケーションのためにHaskellやってんだろ?
素直に答えろよ
101デフォルトの名無しさん:2012/07/02(月) 22:05:49.92
>>98
プログラミングでカッコよさや面白みを追及するヤツは有害
102デフォルトの名無しさん:2012/07/02(月) 22:09:17.93
Haskellで話のネタつくってんじゃねーよゴミクズwww
103デフォルトの名無しさん:2012/07/02(月) 22:24:38.17
Haskell における FRP の発展に興味があり、
おそらく原点であろう論文「Functional Reactive Animation」を読みましたが、
よく分らない部分があります。

data Behavior a =
  (Time -> (a, Behavior a))
  (Ivl Time -> (Ivl a, Behavior a))

このビヘイビアの定義でインターバルを導入する意図は分ります。
(論文の最後のサンプルコードでなるほどと思いました)

しかし、Behavior a 型の値をどうやって作るのでしょうか。

Time によって値の変わらない定数的なビヘイビアなら簡単に作れますが、
たとえば Time -> Bool という型の関数を Behavior Bool 型にリフトアップするには、
どうすればいいのでしょうか。

具体的には、どうやって Ivl Time -> (Ivl a, Behavior a) 型の関数を作るか、です。

論文にはこの辺りの事は何も書かれていなかったと思うのですが、
もしかして私は何かどんでもない勘違いをしているでしょうか。
104デフォルトの名無しさん:2012/07/02(月) 22:27:16.92
>>97
お前とは一生無縁な話だろw
105デフォルトの名無しさん:2012/07/02(月) 22:36:55.11
>>104
仮に私と無縁ししましょう

そこら辺の零細ソフト会社のプログラマに、ハッカーしか使えない言語のメンテナンスができると思いますか?
そして、そのハッカーしか使えない言語を使えるようにするための教育コストのことを考えたことがありますか?
さらに、そんな言語が医療機器や金融関連のインフラに混入してたときの恐怖を想像できますか?
106デフォルトの名無しさん:2012/07/02(月) 22:41:47.08
最近ハスケルの案件がきたのだが
スパゲッティすぎて負えない
107デフォルトの名無しさん:2012/07/02(月) 23:25:04.02
恐怖の正体は
システムを作る人間とシステムを所有する人間が一致しないことなんだよな
108デフォルトの名無しさん:2012/07/02(月) 23:36:24.67
>>105
C++のことですよね。たいへんよくわかります
109デフォルトの名無しさん:2012/07/02(月) 23:58:17.12
adaは教育コストが高すぎる。あんなものがもし軍事関連機器に使われてるなんて考えたら、怖くて夜も眠れないよ。
110デフォルトの名無しさん:2012/07/03(火) 00:01:56.59
金融でOCamlやHaskell使われてるけどな
どうでもいいけど
111デフォルトの名無しさん:2012/07/03(火) 01:35:58.00
>>110
2000年問題のときにATMのソースコードの一部を眺めるチャンスがあったけど、機械語の「ソースファイル」を見付けたときは吹いた
112デフォルトの名無しさん:2012/07/03(火) 06:33:56.40
医療を例に出している以上、ここでいう金融は勘定系だろうけどな。
113デフォルトの名無しさん:2012/07/03(火) 07:03:40.66
医療を例に出すなら、ここでいうハッカーはブラックジャックみたいなやつなんだろう
114デフォルトの名無しさん:2012/07/03(火) 07:17:49.92
Haskellに興味ない => ふつう

Haskellを使ってる => 変わり者

Haskellが難しくて習得出来なかったのが悔しくて煽りにくる => 低能
115113:2012/07/03(火) 08:55:36.05
>>114
変わり者って書くなよ
それが凄いことだと思ってはじめるやついるぞ

たとえば

xxxx=>HENTAI

とか書いちゃうと
世界で変態って言葉通じるだろ?
それもコミュニケーションで使えるし
変態は凄いことって定着してるから
そのxxxxを真似したくなるやつがでる
そういうのやめたほうがいい

それなら"ふつう”って書いとけ
人と違うことをやって ”「それまでの普通」ではない事に挑戦するのが面白い。”
つまりこいつらは ”奇特”、”超人的”にあこがれてるから

変態とか変わり者って書くと 普通から脱却したくて人間の個性の差別化を図りだすから
Haskellを使ってる=>”ふつう”ってかいとけ
わかったか?

でも”ふつう”って書くと、大衆に影響受けるやつは ”ふつう”なんだってなるだろ?
”ふつう”だから皆使ってるだろう 自分も使ってないと乗り遅れてるってなるだろ?
君の書き込みのせいでHaskellユーザーが増えたりする場合あるからやめろ
そういうのは書かなくていい
116デフォルトの名無しさん:2012/07/03(火) 08:57:06.62
良かったな。
117デフォルトの名無しさん:2012/07/03(火) 09:09:00.57
おまえら頼むから業務でつかわんでくれ
毎度スパゲッティしんどいんだわ
118デフォルトの名無しさん:2012/07/03(火) 09:11:00.96
>>117
使っちゃったー。ショボイスクリプトだけどね
119デフォルトの名無しさん:2012/07/03(火) 09:19:40.97
ガンガン使っていけば、>>117みたいなのを皆殺しにできそうだな!
120デフォルトの名無しさん:2012/07/03(火) 09:48:46.07
副作用と型への万全の対策からスパゲッティが生まれるのが面白い
121デフォルトの名無しさん:2012/07/03(火) 11:44:10.86
確かlift0とlift2が定義されてたんじゃない?
122103:2012/07/03(火) 12:53:21.95
>>121
私へのレスでしょうか。

インターバルを導入する前のただの Behavior a には、
表示的意味論として確かに liftn が示されています。
(ここからただちに Haskell の関数も書けるので、定義されたも同然ですね)

しかし、インターバルを導入した後の Behavior a には、
liftn がどういった意味論になるのか示されていません。

正確に言えば、意味論自体は先ほどとほぼ同じで言わずもがなだと思いますが、
実際に Haskell の関数を定義しようとすると、
インターバルの扱いをどうすればいいのかよく分らないのです。

これ、引数で渡した Ivl Time 型の値をもとに、
つまりどの区間の時間かをもとに戻り値を計算するわけですよね。

どうやって計算するのでしょうか。
123デフォルトの名無しさん:2012/07/03(火) 15:47:30.82
data Spaghetti a = Spaghetti (Int -> ([a], Spaghetti a))

newSpaghetti xs = Spaghetti (\i->(take i xs, newSpaghetti (drop i xs)))
124デフォルトの名無しさん:2012/07/03(火) 23:16:00.60
>>122
区間解析そのものの詳細は資料参考にしろってことじゃないの?
125デフォルトの名無しさん:2012/07/04(水) 04:49:32.26
ここにはどうやらHaskellにコンプレックスを持った荒らししかいない様だ。
126デフォルトの名無しさん:2012/07/04(水) 06:13:30.38
有能なプログラマはHaskellみたいな糞言語使わないからな
もっと生産性の高いメジャー言語でバリバリコードを書く
ここにいるやつらは漏れなく自分が頭いいと勘違いして人と違う言語を使いたいだけのアホ
127デフォルトの名無しさん:2012/07/04(水) 06:30:22.26
パラドックスにコンプレックスを持つオーソドックス
128デフォルトの名無しさん:2012/07/04(水) 06:52:00.07
オッスオッスオッスみたいに韻を踏むのはやめろ
129デフォルトの名無しさん:2012/07/04(水) 07:45:19.59
>>126
Haskellでまともにコード書けない低能のお前には
他言語と比較してHaskellの生産性が低いかどうかすら
判断できないじゃん
130デフォルトの名無しさん:2012/07/04(水) 12:06:39.18
>>129
低能にはhaskellは使えないっていう姿勢がまず間違いなんだよ
プログラミング言語は可能な限り平易であるべき
理論が先走っちゃってただ出入力するだけでもモナドとか訳のわからないものを使わなきゃいけないhaskellはただのオナニー言語でしかない

だいたいhaskellの売りである堅牢な型システムはチームでの開発でこそ威力を発揮するのに、低能は引っ込んでろじゃ意味ないだろバカ
131デフォルトの名無しさん:2012/07/04(水) 12:08:13.67
>>126
じゃ、おまえは何がネイティブランゲージなの?
PHPとか?
132デフォルトの名無しさん:2012/07/04(水) 12:10:16.15
低能に使わせなければいいだけ。
土方には必要ない。
土方は頭数仕事しりゃいい。
133デフォルトの名無しさん:2012/07/04(水) 12:38:54.80
>>131
目的に応じて適切な言語を選ぶだけ
ネイティブランゲージ(笑)
134デフォルトの名無しさん:2012/07/04(水) 12:49:42.86
くだらん事でスレ消費するのはこの辺にしておこうよ
135デフォルトの名無しさん:2012/07/04(水) 15:31:56.31
136デフォルトの名無しさん:2012/07/04(水) 19:18:58.43
>>130
Haskellが分からないなら分かるまで待とう
堅牢なシステムには余裕が必要なのに、可能な限り短時間で分かろうとするのは間違いだ
137デフォルトの名無しさん:2012/07/04(水) 19:37:29.40
>>130
Haskell自体はさして難解でもないのに、大した努力もせずにすぐに投げ出したり意味がないと決めつけたりすることが低脳なわけ そんな人間はどこにいっても役に立たないから、引っ込んでてほしいの
138デフォルトの名無しさん:2012/07/04(水) 21:18:08.98
なんか煽りさんが増えてるね
139デフォルトの名無しさん:2012/07/04(水) 22:01:27.94
すごHディス作戦が不発に終わって(外に準備板まであった)奴らイライラしてるんだな
140デフォルトの名無しさん:2012/07/04(水) 22:29:43.98
煽りにマジレスしちゃってる人たちもいい加減気づいて欲しい。
141デフォルトの名無しさん:2012/07/04(水) 22:33:00.76
ラムダとポイントフリーは
くだらない相手を名指ししないことで生産性を高める
142103:2012/07/04(水) 22:36:21.22
>>124
論文の参考資料をいくつか辿ってみました。

区間解析そのものがどういうモノかはそれで分りますが、
連続値を引数とする関数 f を、区間を引数として区間を返す関数 g に変換する
効率の良い方法は結局のところ分りませんでした。

非効率で不正確な方法ならすぐに思いつきます。
入力された区間を適当にサンプリングして関数 f を適用し、
戻り値の最小値と最大値を区間として戻すような関数 g を定義すればいいです。
(Bool 型なら最小値 = False、最大値 = True として計算)

しかし、Behavior a 型の値に関数 during を適用する度にこんな計算をしていては、
アニメーション処理が間に合わず、使い物になりません。

Functional Reactive Animation の Predicate Event Detection のコードでは、
Behavior Bool 型の値への関数 during の適用が効率よく行えることを前提としていますが、
どなたか何かアイデアはないでしょうか。

Functional Reactive Animation では入力となる時間が単調増加なので、
その辺りを上手く利用するのではないかと思うのですが、今の私には思いつきません。


あと、>>122 で区間バージョンの Behavior a には liftn が定義されていないと言いましたが、
実際には同論文内で lift2 の意味論はちゃんと定義されていました。
ただ、肝心の関数 during は定義されていないので、実装的には情報不足です。
143デフォルトの名無しさん:2012/07/05(木) 01:57:38.60
>>138
分からん人にとっては、宣伝の割につまらんという意味で韓流と同じだからな…
144デフォルトの名無しさん:2012/07/05(木) 06:39:49.13
>>136
ホトトギス
145デフォルトの名無しさん:2012/07/05(木) 06:42:11.17
signatureっの訳語ってシグネチャ使わずに何が適切ですか?
146デフォルトの名無しさん:2012/07/05(木) 07:10:11.43
>>145
Haskell の関数定義や式などで型を明示する時に使うのなら、
「型宣言」と訳すこともできると思います。
147デフォルトの名無しさん:2012/07/05(木) 07:26:56.49
>>145
代数モデルなんかの文脈なら「指標」って訳語が一般的っぽいけど。(すげぇミスマッチな気がするけど)

ていうかどの文脈のsignature?
148デフォルトの名無しさん:2012/07/05(木) 07:36:41.20
Could not deduce 〜 arising from a use of 〜 from the context 〜 bound by the signature for 〜 at 〜.

の文脈です
149デフォルトの名無しさん:2012/07/05(木) 08:18:26.76
>>148
その意味の「文脈」じゃねえよwwwwwwwww

そのsignatureは何に関する話題で出てきた用語なの?ってこと。

メールとか認証に使う「署名」だってsignatureじゃん?
名前と型のセットもsignature。
代数モデルなんかの文脈だと、「指標」って訳語が一般的みたいだけど、
普通のプログラマや、言語リファレンスで使われてるのは見たことない。
カタカナでシグネチャが普通じゃん?
150デフォルトの名無しさん:2012/07/05(木) 08:53:55.50
もう型指標って訳します><
151デフォルトの名無しさん:2012/07/05(木) 09:26:08.02
GHCiではコンパイル通るのにrunghc setup buildで通らないなんてあるんですね
152デフォルトの名無しさん:2012/07/05(木) 09:45:20.51
型クラスが、自身を実装する関数を公開しないなら
そのモジュールをインポートしたとき
インスタンス宣言をする事は不可能なのですか?


インポート → 再エキスポートする際に
どうも隠す人がいるようです
153デフォルトの名無しさん:2012/07/05(木) 12:44:09.15
>>152
型クラスが自身を実装する関数を公開しない

この文の意味がまず分らない。

自身を実装するというのは、その型クラスのインスタンスを定義する事だよね。
その関数を公開しないというのは、インスタンス内で定義されている関数の事?
それを公開するかどうかは型クラス側は全く関与しない事だと思うけど。

簡単なサンプルコードを出してくれないか。
154デフォルトの名無しさん:2012/07/06(金) 01:18:43.75
>>153
Eq は not が実装されてる
155デフォルトの名無しさん:2012/07/06(金) 09:36:47.76
>>154
答えになってない
156デフォルトの名無しさん:2012/07/06(金) 11:23:57.16
継続渡しで遊ぼうと思って少し実験してたら、Haskellがいつの間にか手続き型っぽくなってしまった


infixr 1 >::>
(>::>) = flip ($) -- x >::> f = f x
shift = id -- shift f = \x -> f x

calc =
 shift $ \x ->
 x + 2 >::> \x ->
 shift $ \y ->
 y + x >::> \y ->
 x * y

意訳
calc{
 x = shift;
 x = x+2;
 y = shift;
 y = y + x;
 return x * y;
}
shiftはperlのshiftみたいに、引数をとってくる


Monadやらで
do
 x <- hoge1
 x <- hoge2
と書けるのと同じことだけどね
157デフォルトの名無しさん:2012/07/06(金) 15:22:43.93
なぜモナドを使わないのか
158Perl忍者 ◆M5ZWRnXOj6 :2012/07/06(金) 16:06:46.86
モナドしか言えないか・・・
芸が無いな
159デフォルトの名無しさん:2012/07/06(金) 16:31:50.12
Haskellは実行時には型情報をなくしていると聞いたんだけれど、実行時にこのデータがこの型クラスを実装してるんだったらほにゃららっていうようなことは必要になる時ないの?
160デフォルトの名無しさん:2012/07/06(金) 16:43:11.25
ない。

そもそも、アップキャストが無いんだから
> この型クラスを実装してるんだったら
はすべて静的に解決できる。
161デフォルトの名無しさん:2012/07/06(金) 16:48:06.98
>>160
C#の話で悪いが、あるViewがINavigationAwareインスタンスを実装しているならNavigation=画面の遷移時にメソッドを呼ぶとか言うような場合、Haskellだとどうするの?
162デフォルトの名無しさん:2012/07/06(金) 18:03:52.22
Haskellの場合は、複数の値構築子を持つ型を
値構築子でパターンマッチして処理を分岐するコードが、
実行時には何を見て分岐してるかってことになるのかな?
163デフォルトの名無しさん:2012/07/06(金) 18:14:53.17
要はC言語と同じことをすればいいんだろ
.NETじゃない方のWindowsプログラミングをするとか
164デフォルトの名無しさん:2012/07/06(金) 23:25:53.71
C++のテンプレートの特殊化の方が近いんじゃないか?
165デフォルトの名無しさん:2012/07/07(土) 00:46:02.25
100歩譲ってsubtype polymorphismは
時々使いたくなるとしても
アップキャストは不要だろ
166デフォルトの名無しさん:2012/07/07(土) 02:20:45.94
アップキャストとダウンキャストを間違えた...
167デフォルトの名無しさん:2012/07/07(土) 07:03:08.82
値構築子

ねかまきずこ?
168デフォルトの名無しさん:2012/07/07(土) 09:29:05.42
>>165
すまん、なんでダウンキャストいらないのか教えてくれ
169デフォルトの名無しさん:2012/07/07(土) 10:01:27.90
オブジェクト指向でダウンキャストが必要なのは、メソッドを後から元のコードに手を入れないで(再コンパイル無しで)は増やせないからだ。

データの種類(クラス)に応じて振舞いを切り替えるには、
・クラスの実装側でメソッドをオーバーライドする
・オブジェクトの使用側でダウンキャストする
のどちらかになる。
ライブラリ側に親クラスがある場合、親クラスのメソッドは増やせないので、ダウンキャストが必要になる。

Haskellでは、代数的データ型を使って複数のデータの種類を表現するので、ダウンキャストが必要ない。
他の静的型付け関数型言語でも同じ。

ちなみに代数的データ型はScalaのオブジェクト指向の case classに対応する。
170デフォルトの名無しさん:2012/07/07(土) 10:03:07.24
・ダウンキャストは型安全じゃない
・ダウンキャストは代替手段が存在する
・ダウンキャストを必要とするレガシーコードがあるわけでもない
171デフォルトの名無しさん:2012/07/07(土) 10:04:44.97
多態なオブジェクトっぽいものは多くの場合 第一級の関数(というかHaskellならIO ()でも)で実現できる。
環境をクロージャに入れてしまえば、どんなデータでも関数の中で操作できてしまうからだ。

どうしても型に応じたディスパッチがしたいならば、型クラスと存在型が必要になる。ググれ。
それも流儀のひとつと言えなくもないけども、個人的にはあんまり要らない気がする。
172デフォルトの名無しさん:2012/07/07(土) 10:21:33.63
Data.Typeable なんかはダウンキャストっぽい例だから調べてみるよろし
でもそんなの使わないで済むほうが良い設計であることに疑いはない

expression problemを Haskell の型クラスがどう解決するのかをググって見てみるとよい
173デフォルトの名無しさん:2012/07/07(土) 10:24:15.30
>>169-171

ああHaskellではあとからある型クラスの実装をデータ型に追加できるんでしたっけ。
であれば、Viewクラスを管理するものであとからINavigatable的なものの実装を追加できるのでダウンキャストとかしないでできますか。
けどINavigatable的なものがもしも複数あった場合でViewの派生的なものが無数にある場合、インタフェースをあとから追加するならば必要な人だけ実装すればいいけれど、
代数的データ型や型クラスでのディスパッチの場合は全てに場合分けとか実装を書かなければいけなくて新たな機能追加時やViewの種類の追加時にコーディングする量が増えませんかね?
174デフォルトの名無しさん:2012/07/07(土) 10:24:26.78
>>168
そもそも「引数がaで戻り値がbの関数」と「aをbに変換するキャスト」を
区別する必要がない
関数は必要だがアップ関数とかダウン関数などというものは不要
175デフォルトの名無しさん:2012/07/07(土) 10:27:10.58
イメージとしてはUIのフレームワークを作っていて、Viewはユーザーがいろんな種類のものを自由に増やしてく。
でUIのフレームワーク側はViewに対してINavigatableとかあとから色々機能拡張をする可能性がある。
ユーザー側はあくまでもView派生であればUIフレームワークに組み込めるけれど拡張のインターフェースを実装しているならば、それに即した動作ができる。
176デフォルトの名無しさん:2012/07/07(土) 10:29:19.80
>>174
自分が質問したいのは>>175のような場合のシチュエーションでいろんなViewがすでに色々作られてる中、別の拡張属性を追加したい場合。
その関数の例で言えば、すべてのViewの実装に新たな拡張属性についての関数を追加しなければとなりませんか?
177デフォルトの名無しさん:2012/07/07(土) 10:36:25.63
それってViewが型クラスの場合、Viewに追加するメソッドに
デフォルト実装があれば良いだけじゃない?
178デフォルトの名無しさん:2012/07/07(土) 10:40:01.95
GUIなら、wxHaskell http://hackage.haskell.org/package/wx-0.12.1.6 の型が参考になるかも。
179デフォルトの名無しさん:2012/07/07(土) 10:40:28.56
拡張なんてただの建前ですよ
IUnknownとかを拡張するより最初から作り直した方が早いってのがC#の本音
180デフォルトの名無しさん:2012/07/07(土) 10:48:06.74
ダウンキャストの欠点っていくつかあると思うんだが、
その一つとして、コードがそこら中分岐だらけになって拡張が難しくなる、ってのがあるじゃん。

代数的データ型もその点全く同様なのに、パラメータ多相と高階関数が組み合わさると、
あれだけの一般性が得られる、てのはちょっと驚きだった。
コンピュータサイエンス舐めたらイカンと思ったね。
181デフォルトの名無しさん:2012/07/07(土) 10:48:53.01
>>173,175,177
既存の View に追加でuser-definedなデータを持たせるうまい(型安全な)やり方はあるか、
という質問であると理解した。
182デフォルトの名無しさん:2012/07/07(土) 11:21:00.58
もし >>181 であってるなら、 wxHaskell の場合、
Attr (Window a) (Maybe INavigatable)
というAttrを作ってやれば実現できそう。 で、INavigatableには何か色々持たせる。

問題はどうやって そのAttrを作るかだけども、方法は分からなかった。
http://hackage.haskell.org/packages/archive/wx/0.12.1.6/doc/html/Graphics-UI-WX-Attributes.html
あるいはwx-coreに手を入れる必要があるかもしれない。

多態性カッコイイ!任意の型を扱えるのカッコイイ!
ってなるのはわかるけど、そんな機能は無くてもやりたい事を実現できるかもよ、と言いたい。
183デフォルトの名無しさん:2012/07/07(土) 12:46:36.80
だとしたらそれはモデリングの問題で
DCI (Data Context Interaction)
とか当たってみた方がよろしんじゃないかしら
184デフォルトの名無しさん:2012/07/07(土) 16:15:12.31
オレも>>181とたぶん同意意見で、フレームワークのユーザープログラマが、
setCallBack :: (View -> IO ()) -> IO () みたいな関数にView -> IO () な関数を渡さないといけないし、
またViewの定義もいじれない、っていうような状況を>>161は想定しているんだと思う。

そういう場合、フレームワーク側で、View じゃなくってView a みたいな型と、
userData :: View a -> a みたいな関数を用意しておくことにするのが簡単な解決かな。

wxHaskellは知らんけど、>>182の説明しているのも、そういう方向性の解決だと思う。
185デフォルトの名無しさん:2012/07/07(土) 18:54:53.76
簡単でいいならHashTableが簡単。
lookup :: HashTable View INavigatable -> View -> IO (Maybe INavigatable)
186デフォルトの名無しさん:2012/07/07(土) 19:07:25.76
haskell的にはHashTableよりも連想リストかMapじゃないの
187デフォルトの名無しさん:2012/07/07(土) 19:49:11.27
>>186
どうしてなの?
188デフォルトの名無しさん:2012/07/08(日) 02:54:54.20
>>187
永続データ構造使った方がいいんじゃないかな
189デフォルトの名無しさん:2012/07/08(日) 08:39:37.66
個人的には同型対応する方がいいから普通の言語と同じ方がいい。
190デフォルトの名無しさん:2012/07/08(日) 08:55:08.51
>>188
すまん、もう少し詳しく。

今回の件でなぜ永続データ構造の方が望ましいのか。
永続データ構造に比べて HashTable だと不利なるケースは何か。
という辺りを。

俺には今回の件で、永続データ構造でも HashTable 使っても、
プログラムの見やすさや効率の点で大して変わらないように思える。

というのも、>>181 の意図であるなら、
永続データ構造を使ってもその値は結局 IO モナドを被せた方が、
プログラムがスッキリするような気がするのだが。
191デフォルトの名無しさん:2012/07/08(日) 09:14:23.10
既存のGUIをFFIで呼ぶならmutableなHashTable使う以外の選択肢はないでしょー

wxFruitみたくFRPっぽく宣言的にするならともかく
192デフォルトの名無しさん:2012/07/08(日) 09:14:49.61
有利不利とは関係ないけど、Data.HashTableはGHC 7.8.1で削除されるそうな。
http://www.haskell.org/pipermail/cvs-libraries/2012-June/015725.html
193デフォルトの名無しさん:2012/07/08(日) 09:20:44.92
wxcoreで wxWidgets のC++の継承関係をHaskellで表現するやり方が面白い
一番親の(C++)クラス EvtHandler は Haskell の EvtHandler a という型で表し
その子クラス Window は EvtHandler (Window a),
さらにその子クラス Frameは EvtHandler (Window (Frame a)) というように
パラメタ多相でうまく(?)エンコードしている

ただ、既存のwxWidgetクラスをHaskellでどうやって継承するのか謎
194デフォルトの名無しさん:2012/07/08(日) 09:33:50.12
既存のC++クラスがObjective-C++/CLIでどんな扱いを受けているか考えれば大体わかる
195デフォルトの名無しさん:2012/07/08(日) 11:39:58.99
例えばData.HashTable.STを使ってね、とある。
http://hackage.haskell.org/package/hashtables/
196デフォルトの名無しさん:2012/07/08(日) 15:40:24.88
>>194
どんな扱いを受けてるの?
197デフォルトの名無しさん:2012/07/08(日) 22:29:03.76
それはそれ、これはこれ
198176:2012/07/09(月) 00:43:57.30
ちょっと2ch離れてました。すみません。
自分的には>>177で言われてるデフォルト実装があればコード量の増大はなくなるかなーと納得。

>>181
ちょっとHaskellまだ勉強したてなので結論としてそういうふうに落ち着くのかちょっとわからず。
C++やC#でViewクラスを継承した色々なクラスで、View自体の実装とは関係のない別の性質を持たせたい場合、型クラスを使った時にコードが膨らまないかという意味。余計わかりにくいかもですが。
一つの方法として>>181のような外部から属性を追加するという方法でも実現は出来ると思います。

>>193のやり方を具体的に理解してないですが、自分のイメージに近そうな予感。

いずれにしてもC++/C#的なやり方でなくて、他にうまいやり方がありそうな気が。精進してきます(´・ω・`)
199デフォルトの名無しさん:2012/07/09(月) 01:20:52.64
UIって、自動コーディングできなのだろうか
ロジックとViewを上手に分離したら、Viewの部分は仕様だけ用意すればあとは自動でhsコード出力できないのだろうか

上級者はやってるんだろうな…
200デフォルトの名無しさん:2012/07/09(月) 11:18:53.32
文字実体参照の変換を取り扱うライブラリはありますか?

&gt; ⇔ >
201デフォルトの名無しさん:2012/07/09(月) 20:03:56.84
ParseCじゃ無理なん?
202デフォルトの名無しさん:2012/07/09(月) 22:24:54.08
モナドわけわからん
203デフォルトの名無しさん:2012/07/09(月) 22:44:04.41
モナドの「何が」わけわからん の?
204デフォルトの名無しさん:2012/07/09(月) 23:05:22.23
モナドの利点とされるもののうち、どこまでがモナドの利点で、どこまでが型クラスの利点なのか
ごっちゃになってわけわからん
205デフォルトの名無しさん:2012/07/09(月) 23:09:32.93
機能毎に分割できるというところがモナドの利点
それ以外が型クラス
206デフォルトの名無しさん:2012/07/09(月) 23:11:13.11
つ チラ裏
207デフォルトの名無しさん:2012/07/09(月) 23:23:54.84
>>204
たしかに、わけわからなくなりそうな疑問だな。

不純な計算を形式化/モデル化できることがモナドという代数的構造の利点で、
実装の異なるデータの集合を代数的構造の面で抽象化・一般化してプログラミングできることが型クラスの利点で、
両者あわさって、実装/意味の異なる不純な計算を抽象化・一般化してプログラミングできることが
モナドという型クラスが存在する利点、といってみるテスト
208デフォルトの名無しさん:2012/07/09(月) 23:25:36.01
不純でない計算も形式化できるよ > モナド
209デフォルトの名無しさん:2012/07/10(火) 00:06:37.86
型クラスない言語でモナってるのを見れば?
210デフォルトの名無しさん:2012/07/10(火) 00:35:06.79
簡約を遅延することと、IOを実行しないでおくことの違いを説明してください
211デフォルトの名無しさん:2012/07/10(火) 01:04:20.52
>>210
着眼点がぜんぜん違うから、比較すること自体が困難だな。

例えるなら、ハローワークに行こうと決意するのを先延ばしにするのが簡約の遅延で、決意したけどなかなか行かないのが実行の遅延。
212デフォルトの名無しさん:2012/07/10(火) 01:30:08.39
計算のシーケンスを代数で表現したのがモナド
しかもモナドが必要十分の構造というわけでもない
213デフォルトの名無しさん:2012/07/10(火) 01:58:22.49

簡約は式を評価する時になされることだから、式の値が要求されるまで簡約は遅延される
IOも、その結果が要求されるまで遅延される
どちらも遅延評価の結果 と考えています
214デフォルトの名無しさん:2012/07/10(火) 08:32:24.44
>IOも、その結果が要求されるまで遅延される
ダウト
215デフォルトの名無しさん:2012/07/10(火) 08:58:05.68
>>209
ツボにはまったw
216デフォルトの名無しさん:2012/07/10(火) 11:59:56.17
>>214
それがIOもサンクなんだよな、、、
217デフォルトの名無しさん:2012/07/10(火) 12:02:54.97
Maybeは不純
218デフォルトの名無しさん:2012/07/10(火) 22:11:47.43
純粋(pure)がどうたらこうたらというのはHaskellの存在意義として
重要なだけであって、モナドは関係ない。
計算(computation)もHaskellでは特筆する話ではない。なぜなら計算概念が
一体何のことなのか、いまのところ固まってないため。
モナドの利点は入出力、リスト、継続、環境、状態、例外処理などをそれぞれ
”切り分けることができるようになる”というところだ。
書くコード書くコード全部スパゲッティ化するプログラマでも、モナドの枠組みに合わせるように
コードが書ければ、あら不思議、ちゃんと機能毎に切り分けられます、という理論。

そもそも疑念に思うべきところは、例えばリストモナドはリストのみで完結していて、他のMaybeモナド
には一切影響がないというところだった。これは、よく考えると驚くべきことだ。
219デフォルトの名無しさん:2012/07/10(火) 22:13:05.49
他のMaybeモナドには
じゃなくて
他のMaybeモナド等には
で。
220デフォルトの名無しさん:2012/07/10(火) 22:29:29.28
それ型クラスの利点…
221デフォルトの名無しさん:2012/07/10(火) 22:30:56.35
しばらくモナるわ
222デフォルトの名無しさん:2012/07/10(火) 22:31:18.50
言い訳Maybe
223デフォルトの名無しさん:2012/07/10(火) 22:45:04.56
型クラスがどこからどこまでを指すのかわからないので今は明確に違いは言えない。

とりあえず種本は下記なので、疑わしいならば読め。
http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.31.2885
224デフォルトの名無しさん:2012/07/10(火) 23:24:08.47
先入観があると内容が意味不明に写ると思うのであらすじを書いておくと、
この論文の名前はSemanticLego(意味論的レゴ)という名前で
内容は、表示的意味論は理論としては強力だけれど、実際プログラミング言語を
実装しようと思うと、拡張性が悪すぎてちょっと機能を追加しようと思うと
いままでのコードをかなり書き換える必要があってすごい実用性が低い
ということをSchemeの実例コードを使って示していく。
そののち、モナドという枠組みを使って言語を組むと、拡張性も良くて
意味論的組合せもレゴのように自在に可能であることが示される。
225デフォルトの名無しさん:2012/07/10(火) 23:25:09.93
すまん。推敲が足りなかった。
226デフォルトの名無しさん:2012/07/10(火) 23:56:09.39
モナドを使って意味論定義をモジュラーにする話はよく知っているつもりだけど(一応専門なので)
>218の

> モナドの利点は入出力、リスト、継続、環境、状態、例外処理などをそれぞれ
> ”切り分けることができるようになる”というところだ。
> 書くコード書くコード全部スパゲッティ化するプログラマでも、モナドの枠組みに合わせるように
> コードが書ければ、あら不思議、ちゃんと機能毎に切り分けられます、という理論。

の意味はさっぱりわからない。
227デフォルトの名無しさん:2012/07/11(水) 00:40:05.13
慌てていたので、別のところに投稿してしまって重複投稿になっていますが、
こちらが正しい投稿先です。
----
>>226
そう突っ込まれるとうまく返せん。しばし待て。
とりあえず意図としては、
1行目は個々の機能毎にモジュール化できるということを言っているつもり
2行目は機能毎にモジュール化できるということが具体的にどういうことか
言おうと思って出した例。そんなことができるかはわからない。

とりあえず、自分はこのように理解していて、説明しようとするとこういう風になる。
226が説明しようとするとどうなる?
228デフォルトの名無しさん:2012/07/11(水) 00:43:48.44
そもそもHaskellのモナドって計算理論のモナドなのだろうか?
なんか異和感がある
229デフォルトの名無しさん:2012/07/11(水) 09:02:56.52
日々Haskellでモナニーしてるみなさんおはようございます

mtlの道場的サイトを紹介してください
実例豊富なのがいいです^O^
230デフォルトの名無しさん:2012/07/11(水) 09:16:33.33
>>218だけ見ると構造化プログラミングか何かの話に見えてしまうな
モナドの利点って、今までとは違った観点で切り分けられることだと思うんだけど、うまく説明できない
231デフォルトの名無しさん:2012/07/11(水) 09:38:59.72
んお?モナドって文脈を持ったものを普通の記述でスッキリかけてナイスってことじゃないん?
232デフォルトの名無しさん:2012/07/11(水) 11:31:29.20
文脈ってのも曖昧だしなあ
233デフォルトの名無しさん:2012/07/11(水) 11:41:44.22
自分的にはIOの事忘れてざっくりと"文脈"とくくったほうが理解しやすかった。
ファンクターは普通の関数を文脈持った値に適用する。
アプリカティブは文脈持った値?に文脈持った値を適用する。
モナドは文脈持った処理をくっつける。
234デフォルトの名無しさん:2012/07/11(水) 12:30:54.84
なぜモナドの事を忘れて一般の型クラスを総括しないのかね。
忘れていい事と忘れてはならない事を見分ける方法はあるだろうか。
235デフォルトの名無しさん:2012/07/11(水) 12:34:18.32
>>234
忘れていい事とは何かをちゃんと定義できれば集合は分割できる。

だから見分ける方法はちゃんと定義する事だ。
236デフォルトの名無しさん:2012/07/11(水) 20:16:31.49
悪いがもう話をしたくない。
237デフォルトの名無しさん:2012/07/11(水) 21:27:45.79
Repa でガウスぼかしみたいな畳み込み演算をしたいです。

一次元で言うと、

元データ [x0, x1, x2, x3, x4]
カーネル [k0, k1, k2]

演算 [x0*k0 + x1*k1 + x2*k2, x1*k0 + x2*k1 + x3*k2, x2*k0 + x3*k1 + x4*k2]

こんな感じの演算です。

今は traverse2 関数を使い、いちいち各配列のインデックスを指定して計算していますが、
他にも方法はあるのでしょうか。
238237:2012/07/11(水) 21:30:03.63
すいません。

他にもっと効率のいい方法はあるのか、という質問です。
239デフォルトの名無しさん:2012/07/13(金) 22:21:32.07
>>228
一体何でそんな話になる?
分割できて自由に組み合わせできるという以上の話なんてないはずだ。
そもそも計算理論のモナドとはなんのことを指すのか答えろ。

>>234
じゃあお前が総括しろ。
240デフォルトの名無しさん:2012/07/14(土) 00:51:44.58
>>239
そもそもと言ってるのだから、改めてより深いテーマを提起しているのでは?

計算理論のモナドとは何かというのは、私もぜひ聞きたいです。
おそらく圏論のモナドの事を言っていて、
これと Haskell で利用されているモナドとの間の相違点が気になる、
という話ではないかと思うのですが、違いますか?


私には、>>239 がなんで命令形なのかよく分らない。
無駄に波風の原因を作らず、もっと普通に訊けばいいと思うんだけど。
241デフォルトの名無しさん:2012/07/14(土) 06:48:22.16
失礼した。ただ、やはりもうあんたらに形式上でも話をするのはいやだ。
242デフォルトの名無しさん:2012/07/14(土) 06:50:15.15
ということがわかった。
243デフォルトの名無しさん:2012/07/14(土) 08:51:48.20
はあ、そうですか
244デフォルトの名無しさん:2012/07/14(土) 10:30:52.62
Haskellの型クラスはMLのファンクタと同じで、名前空間を入れると名前空間が出てくる
instance Monad Foo where ・・・で名前空間をインプットすると
Monad a => の型をもつ全ての名前がアウトプットされる

ただし、Haskellで演算子オーバーロードを多用するためには名前空間を明示したくない
そこで型推論を改造して名前空間も省略できるようにしたのが型クラスだ
245デフォルトの名無しさん:2012/07/14(土) 10:37:20.23
>>218
”切り分けることができるようになる”というのは名前空間のことを言ってるだけだと思う
246デフォルトの名無しさん:2012/07/14(土) 11:33:45.51
>>223にsemanticsはcomputation ADTとlanguage ADTに分けられるが
computation ADTはmonadとmonad transformer使って切り分けられるからpolymorphicにできると書いてあるよ
型クラスは使い易くするだけ
247デフォルトの名無しさん:2012/07/14(土) 13:16:29.92
>>223のfigure 1.18のように
SemanticLegoではmake-computationsを使ってcomputation ADTの構築を手動で書くが
Haskellは型クラスの仕組みを使って自動的にやらせることができるから便利
ということだろう
248デフォルトの名無しさん:2012/07/14(土) 20:55:40.42
accelerate-cuda パッケージを使ってみた人いますか?

私は今のところ生憎 CUDA 環境がないので、ネット上の CUDA に関する情報や
サンプルコードなどを見て想像するしかないのですが・・・

[1] 全体の使用感はどんな感じなのでしょうか。
処理の速さは感じられますか。

[2] プログラマは CUDA のメモリなどの仕組みは全く、
あるいはほとんど意識する必要が無いのでしょうか。

[3] 実行ファイルにコンパイルしないと CUDA は働かないのでしょうか。
それとも ghci 上でも、Haskell のデフォルトのリストや配列よりも速いでしょうか。

特に [2] の質問でよい応えが得られれば、
ワークステーションクラスのノートPCをひとつ買ってみようと思います。
249デフォルトの名無しさん:2012/07/15(日) 00:59:34.76
名前空間をインプット/アウトプットするという言い方は良くわからないし、あまり見たことも無い
MLのファンクタならそういえなくもないけど
250デフォルトの名無しさん:2012/07/15(日) 01:10:01.92
そもそもなんで >>223 が出てきたのか謎
そういうのを今更じっくり読むくらいならもっとMonadTransなコード書いた方がいいんでないの??

251デフォルトの名無しさん:2012/07/15(日) 03:09:19.01
関数的で高機能な物理エンジンない?
一通り探したけど,どれもc辺りへのbindingで剛体の位置得るだけなのにIO必須で好きじゃない

haskellってこういうのに得意なイメージあったんだがなあ
関数型だと遅くて現実的じゃないのだろうか
252デフォルトの名無しさん:2012/07/15(日) 07:42:18.12
そういう用途で使ってる人が少ないだけじゃね?
253デフォルトの名無しさん:2012/07/15(日) 08:00:53.85
Haskellは型推論が得意
型には物理的実体がない
どちらかと言えば、想定外の型を受け取りたくないという精神的なものを表現するのが得意
254デフォルトの名無しさん:2012/07/15(日) 11:51:37.81
そうじゃなくて、函数プログラミングのパラダイムが物理演算に向いてるかどうかって事じゃねーの
型が精神的ってのも激しく謎だが
255デフォルトの名無しさん:2012/07/15(日) 12:11:20.25
http://hackage.haskell.org/package/Paraiso-0.1.0.0
低レイヤーのエンジンに、合成して突っ込む形のものは向いてるかもしれないね。
256デフォルトの名無しさん:2012/07/15(日) 12:49:38.11
そもそもOpenGLが大々的に紹介されてときは関数型パラダイムだともてはやされてたのに…
257デフォルトの名無しさん:2012/07/15(日) 12:52:25.71
>>251
> haskellってこういうのに得意なイメージあったんだがなあ

どこからそんなイメージが湧いてくるの?

自分で物理演算をちょっと試してみて
「お、結構いけそうかも」って思えたの?
258デフォルトの名無しさん:2012/07/15(日) 13:23:51.38
何年か前までJavaScriptは関数型言語だった
関数型言語の集合は、国境や法律のように時々変わる
259デフォルトの名無しさん:2012/07/15(日) 14:15:14.70
>>257
OpenGLとかもそうだけど、最近の物理演算エンジンはロジックがステートマシンであることを前面に出してるから
その宣伝を鵜呑みにすれば、Haskellが得意なはず
260デフォルトの名無しさん:2012/07/15(日) 14:34:39.22
>>259
話をぶった切って悪いが、丁度よい機会だから訊いてみたい。

Haskell でステートマシンを組む際のよい見本となる解説を教えてほしい。
ネットも書籍も探してみたが、なかなか見当たらない。

ゲームを作ろうと思ってる。
ステージ切り替え、場面切り替えなどでステートマシンを使うと良さそうだが、
どうにも手続き型っぽくなってしまう。
状態を保存したりするのに、どうしても IORef に頼ってしまうんだ。
261デフォルトの名無しさん:2012/07/15(日) 17:43:44.11
その手続きっぽいコードの例をお願い
262デフォルトの名無しさん:2012/07/15(日) 19:56:03.09
>>261
自分のゲームの今のコードは複雑で長く、何より汚いから晒すのは正直恥ずかしい。
だから晒すのは、手続きっぽくて嫌だなぁと思うエッセンスの部分だけね。

簡単に言えば、[タイトル画面シーン] や [オプション画面シーン] などシーン毎に関数を作ってる。
この関数は、戻り値として「次のシーン」を返すようになっていて、
シーン内でプレイヤーが行った行動などによって次のシーンを決定する。

newtype SceneProc = SP (Time -> GamePad -> (ScreenDesc, SceneProc))

titleScene :: GameData -> SceneProc
titleScene gd = SP $ \t gp ->
  let scr = makeScreenDesc -- 画面を構成する指示書を作る
  in case 時間やゲームパッドなどの状態 of
    オプション画面へ遷移するなら -> (scr, optionScene gd)
    とくに何もしていないなら -> (scr, titleScene gd)

optionScene, playScene, gameOverScene・・・ :: GameData -> SceneProc

mainLoop :: SceneProc -> SceneProc
mainLoop (SP scene) = do
  (t, gp) <- 現在時間とゲームパッドの状態
  let (scr, next) = scene t gp
  disp scr -- 画面表示
  mainLoop next

(実際は GameData 型の中で IORef を多用してる。その方が記述がスッキリするから)

で問題は、こういう作りだと、titleScene などの各シーン関数で、
やたら if や case of で場合分けする羽目になるということ。
A なら B、C なら D、A でかつ B なら E などの記述が並んで、
ハッキリ言って、関数型特有の宣言的な記述からはほど遠く見える。
263デフォルトの名無しさん:2012/07/15(日) 19:58:59.40
ごめん、mainLoop は IO ね。

でも雰囲気は分ってもらえると思う。
264248:2012/07/15(日) 20:23:42.91
OpenCL パッケージの方でもいいです。
使ってみた方はいるでしょうか。

パフォーマンスはどれほど出るものなのでしょうか。

このパッケージの github にあるサンプルコードを見てみると、
こちらは自分で OpenCL のコードを書かなければならないみたいですが、
DSL タイプの支援ライブラリは無いのでしょうか。
265デフォルトの名無しさん:2012/07/15(日) 21:37:54.99
>>237
いろいろ試しているけど、
あなたが今使っているコードがどういうものか分からないので、
比較ができないぁ

あなたがいま実際に取り組んでいる実際の問題でなくても構わないので、
高速化をしたら比較できるような対象となるお題コードを、
http://ideone.com/ とかにアップしてURIを張り付けてよ
266デフォルトの名無しさん:2012/07/15(日) 22:21:35.02
267237:2012/07/15(日) 23:00:10.71
>>265
http://ideone.com/l7Ina に私のコードを貼り付けました。
そのまま ghci でロードして頂ければサンプルデータで実行できます。

任意長の元データ b とカーネルデータ k (|b| >= |k|)に対して、
>>237 のような演算を行う関数 calc を定義しています。

このコードの (\i -> kp (Z:.i) * bp (Z:.ic+i)) の辺りが何とも間の抜けた感じです。
配列に対してインデックスで要素単体を指定して演算しているのが、
なんていうか Haskell らしくないというか、気持ちが落ち着かないというか・・・

traverse 系関数ではこういうインデックス指定に対して特に最適化して作られていて、
この方法が最も効率がいいというのなら仕方ありませんが、
もっと効率よくて見やすいコードになるのなら嬉しいです。


ちなみに >>237 のような演算は、同じカーネルを対角線に階段状に並べたN重対角行列と、
元データのベクトルとの積の演算なので、hmatrix でやった方が速いかも知れませんね。
明日 hmatrix を入れて実検してみます。
268デフォルトの名無しさん:2012/07/16(月) 00:55:59.93
>>267
http://ideone.com/e6PGR

sumP と *^ を使ってみた。

kernelのsizeを約100、baseのsizeを約10000にして
ベンチマークフレームワーク ceriterion を使って測定してみたら、
15万倍くらいはやくなってる。39.45803 msから256.1315 nsヘ。

・・・マジで?

我ながら信じられないので、 ceriterion の使い方間違っているような気がする。
nsはナノ秒だよね? よね?
269デフォルトの名無しさん:2012/07/16(月) 01:40:46.31
>>262
SceneProcはステートマシンとしては普通の定義だと思う。

>やたら if や case of で場合分けする羽目になるということ。
そういう風に定義する計算モデルなのだから致し方ない。
ステートマシンを状態遷移表で書き下したとき、

・titleSceneやoptionScene等の関数が「状態」
・パターンやガードが「入力」
・その右辺式の値が「出力と遷移」 (ScreenDesc, SceneProc)

に対応していて、ミーリー型オートマトンを定義してる、と考えるといいと思う。
Monadiusの定義だとムーア型かな。
シーンを関数として作る、というのは方向性として間違ってないんじゃないかな。
各シーンの内部状態をさらにどうしてるかが問題だけど。
IORefを多用している事と、ステートマシンが分岐だらけであることとはあまり関連性がない気がする。

とりあえずステートマシンの参考になりそうな、有名所を適当に上げると、、
SceneProcの定義はYampaの定義が一番近いと思う。Netwireも確かこんなん。
これらの単純なモデルは、arrowsパッケージのAutomaton i o。(関数型プログラミングの楽しみ10章の単純オートマトン)

変種としては、
SceneProc r
 = SP (Time -> GamePad -> (ScreenDesc, SceneProc r))
 | Done r
と、Done rを付け加えるとモナドにできて、コルーチンみたいな中断/再開が可能になる。(Done rは受理状態に相当。)
Enumeratorとか、Conduit、Pipes、もこのタイプ。
これらをさらに抽象化したのがmonad-coroutineで、コイツは実はMonadFreeというものに解りやすい名前を付けただけ、
とか色々奥の深い世界があったりする。
MonadFreeの別の応用としてOperationalモナドというのもあったり…。(自動モナド化とか、インタプリタとか興味深かった)

270デフォルトの名無しさん:2012/07/16(月) 02:15:42.25
>>268
演算の中に畳み込みが入ってるなら、配列要素数に比例する以上の速度変化が出てもそれほど不思議じゃない
ただ、ghci環境でやってるなら速度計測はまったくアテにならない
exeファイルを作って計測すべき
271デフォルトの名無しさん:2012/07/16(月) 04:49:51.07
Haskellを擬人化するなら寡黙な女の子だね
言葉を選んで口数少なく
あ、うん……
272デフォルトの名無しさん:2012/07/16(月) 04:51:59.44
>>233
アプリケイティヴって読んでた……:(;゙゚'ω゚'):
273デフォルトの名無しさん:2012/07/16(月) 06:51:33.61
>>271
ちょっとした間違いを見つけると厳しく指摘する神経質な理系女子…

ナンカイヤダ
274デフォルトの名無しさん:2012/07/16(月) 07:43:11.05
Agdaさんと付き合うとHaskellさんぐらいの口うるささは可愛いものだと思えるのでお勧め
275デフォルトの名無しさん:2012/07/16(月) 08:02:09.32
>>271
完全に同じイメージだった…

物静かだけど非常に厳しい
276デフォルトの名無しさん:2012/07/16(月) 18:23:56.33
非常に厳しいのも我々をバグから守ってくれてるのだからと考えればまた愛おしい
277262:2012/07/16(月) 18:54:36.66
>>269
この方向で洗練させていくには、結局俺は何を勉強してみるのがいいんだ?

ミーリー型オートマトンがどういったものか調べてみればいいのかな。
それとも、Yampa や Netwire や Automaton i o の中身を調べてみればいいのかな。

変種としては・・・以降の話は、基礎を学んだその後の話だよな、きっと。
278237:2012/07/16(月) 19:48:07.97
>>268
コンパイルして試してみたところ、calc1 の方の結果が、

ideone_e6PGR.exe: .\Data\Vector\Generic.hs:244 ((!)):
index out of bounds (-2147483648,100000)
ideone_e6PGR.exe: thread blocked indefinitely in an MVar operation

と表示されたのですが、何か問題あるでしょうか。

こちらの環境は、下記の通りです。

Intel Core2 Duo 2.4GHz メモリ 2GB
Windows7
ghc 7.4.1 (repa-3.2.1.1 criterion-0.6.0.1)
279デフォルトの名無しさん:2012/07/17(火) 01:32:45.61
>>278
ありがとう。
確かに、Windows 7環境だと、こっちでも同じエラーが出る。

というわけで、criterion周りを多少変えて、かつ新しい関数calc2を加えたコード
http://ideone.com/hdl0v

これだと、Windows 7だとcalc1はcalc0よりも遅い。
しかし、calc2はcalc0よりも数%だが速い。

別PCのUbuntuだと、calc2 > calc1 > calc0で速い。
しかも、calc2はcalc0の2倍くらい速い。

15万倍も速くなるなんていうのはおかしいから、前回の結果は測定方法に問題があったのだと思う


なお、ソフトのバージョンは両方とも
GHC 7.4.1
repa 3.1.0.1
criterion 0.6.0.1
280デフォルトの名無しさん:2012/07/17(火) 01:34:14.90
>>278
コンパイルするときに実行時のメモリ量を指定できるから、メモリを増加して実行しても同じメッセージが出るなら配列の添字指定でミスってる
メモリ増やしてエラーの配列のboundsの数字が変わるなら、メモリが足りなかったか、MVarでミスってる
281デフォルトの名無しさん:2012/07/17(火) 01:47:31.39
>>277
場合分けの嵐になるのはそういう状態マシンである以上仕方ないと思うけど、
IORefを多用しているというのが非常に気になる。

察するに、例えば、ゲームの自機や敵が動いているアクション画面(と呼ぼう)から
装備変更画面だとかコンフェグ画面だとかに遷移したあと、またアクション画面に戻ったとき、
自機や敵の位置など前回のアクション場面のパラメータが保存されてなければならないが、
それを装備変更画面だとかコンフェグ画面だとかの間中保持して受け渡し続けるのがうざい、
ということなんだろうか?
282デフォルトの名無しさん:2012/07/17(火) 01:58:11.92
環境遷移は、一つのステージからの分岐が3つ以上あったら、IORefを使わない方が繁雑になると思う
IORefを避けるなら、ゲームのどの環境遷移も二分岐以下の合成で表現できるという制約をゲームの仕様にくっつけるべきではなかろうか
283237:2012/07/17(火) 19:38:27.61
>>279
試したところ、ちゃんとテストできました。

こちらでも同じ傾向が出ました。
calc1 は遅いですが、calc0 と calc2 がほぼ同じ速度です。
何回かテストすると 0 と 2 で順位が入れ替わることもあり、
差はたぶん誤差の範囲で済まされるレベルだと思います。

ただ、気になる点がひとつ。
defaultMain 関数でテストする関数をリストしていますが、
calc0 1 2 のテスト順をどう入れ替えても、最初にテストするものだけ、
かならず異常値によって発生した分散が 50% を越えます(80%いく時も)。
何なんでしょうかね。

あと、せっかくなんで RTS の -hc オプションを付けて
使用メモリの量や傾向も測ってみました。
こちらのテストでは、calc0 に対して calc1 と calc2 は
使用メモリ量が 10 倍高かったでかす。
と言っても、kernel=[1..100]、base=[1..10000] で 1 サイクルを計測して、
calc0 で 14kByte 強程度なので、たかが知れてますが。

そして、当然と言えば当然ですが、メモリ使用の傾向は
calc0 では綺麗な三角形に、calc1 や calc2 では台形になりました。

速度、メモリ双方のテストで少し意外(期待はずれ)な結果になりました。
このような1次元や2次元の畳み込み演算は応用も広く需要ありそうですが、
もっと綺麗に書ける専用関数をライブラリに入れてほしいものです。

今回は大変勉強にになりました。ありがとうございました。
284デフォルトの名無しさん:2012/07/18(水) 08:26:34.33
>>276
なんだ老婆か
285デフォルトの名無しさん:2012/07/19(木) 13:35:25.39
入門者の私が「Lazy IOか、なるほどいいものだな」なんて思いながらRWH読んでたら…

"you must not close the Handle until you have finished consuming its results <<via>> hGetContens.
Doing so would cause you to miss on some or all of the file's data."

とんだ落とし穴じゃないか。。。
286デフォルトの名無しさん:2012/07/19(木) 13:42:02.59
もっと先に勉強を進めて!
287デフォルトの名無しさん:2012/07/19(木) 14:09:02.87
それはconduitやiterateeの動機のひとつだな
Lazy IO()の代わりにこれらを用いたRWHに相当する本が待たれるところ
288デフォルトの名無しさん:2012/07/19(木) 15:26:55.33
RWHはある意味キワモノ本だから、他の入門読めばいいと思う。
289デフォルトの名無しさん:2012/07/19(木) 19:32:40.39
>>285
どういうコード書いたらこんな事態に遭遇するの?
290デフォルトの名無しさん:2012/07/19(木) 21:19:09.81
txt <- withFile "パス" ReadMode hGetContents

とか
291デフォルトの名無しさん:2012/07/19(木) 22:50:12.66
>>289
大量のファイルからデータを読み込んでデータベースに叩き込む処理を書いたときに、
OSのファイルディスクリプタの数の制限に引っかかって、ファイルを閉じる処理を入れたら、
これではまった。

まぁ、これも、ファイルを閉じる処理をデータを入れる処理の後に書けばすむ話だったわけで、
知っていれば容易に避けられる問題ではある。
292デフォルトの名無しさん:2012/07/20(金) 01:45:59.81
コネクションをきちんとcloseする処理を入れないと、RDBのスレッド数の制限にもひっかかってデータが消えるというオチ
293デフォルトの名無しさん:2012/07/20(金) 11:20:14.00
>>291
はあ
294デフォルトの名無しさん:2012/07/20(金) 11:22:34.22
これはひどい
295デフォルトの名無しさん:2012/07/20(金) 15:14:51.49
Haskell以前の問題である
296デフォルトの名無しさん:2012/07/20(金) 23:05:22.41
のちの坂本龍馬である。
297デフォルトの名無しさん:2012/07/21(土) 01:17:00.83
TemplateHaskellで型クラスでの型族宣言を書くにはどうすればいいんでしょうか?
型クラスをreifyしてもfamilyDなんかは見当たらないのに、
(その型クラス内での)型族をreifyすると普通に型クラスの型変数を共有してたりして、どう書いたら良いのか分からんのです
298297:2012/07/21(土) 01:34:57.57
runQならfamilyD取ってこれました
お騒がせしてすいません
299デフォルトの名無しさん:2012/07/22(日) 16:06:44.03
>>285
ようわからんけど
無限リストの扱いみたいに、必要な分だけもらって後は知りませんよ的コードじゃなくて、
全部使う事を前提とした書き方の時は心配しなくていいってこと?
300デフォルトの名無しさん:2012/07/22(日) 16:11:11.73
>>299
遅延 IO に限らない話だが、
リソース(ハンドラ)を解放する前に、必要な分のデータを消費するなら、問題ない。

遅延 IO だと、必要な分のデータを消費する前にリソースが解放されてしまう可能性に、
ソースをぱっと見た限りではなかなか気づかない可能性が低くないことが問題。
301デフォルトの名無しさん:2012/07/22(日) 16:24:37.28
確認したいんだけど、hGetContentsの場合だけだよね?
302デフォルトの名無しさん:2012/07/22(日) 16:51:24.81
>>301
遅延 IO に関する問題で、>>300 に示したものについては、
hGetContents 関数や getContents 関数を使用した場合に多く見られる。

遅延 IO に関する問題は逆に、データが完全に消費する(読まれる、かな)まで
リソースが解放されない、という問題もある。
こちらは、readFile 関数などでよく見られる。

これらはあくまで私が自分でよく体験した問題です。
他にもあるかも知れません。
303デフォルトの名無しさん:2012/07/22(日) 17:48:07.53
>>299
引用元は↓のサンプルコード"ch07/toupper-lazy2.hs"のすぐ後にあるwarningですよ。
ttp://book.realworldhaskell.org/read/io.html

読者のコメントも付いてますね。
304デフォルトの名無しさん:2012/07/23(月) 02:19:06.20
HaskellのIDEってみなさんはやっぱりlelksahなんですか?
305デフォルトの名無しさん:2012/07/23(月) 07:07:34.51
HaskellのIDEって何をIntegratedしてるのかよく分らんな

俺はEmacsで十分だけど
306デフォルトの名無しさん:2012/07/23(月) 08:14:53.53
補完と型表示さえあればとりあえず充分だからなあ
leksahも使ってみたけど結局Vimに落ち着いた
307デフォルトの名無しさん:2012/07/23(月) 11:06:49.19
Haskellのお薦めVimプラグインを教えてください
308デフォルトの名無しさん:2012/07/23(月) 20:30:36.42
すごいH読んでるけど、練習問題とかないと、ダレちゃうな
309デフォルトの名無しさん:2012/07/23(月) 20:43:41.82
自分で練習問題作ればいいと思うが。
310デフォルトの名無しさん:2012/07/23(月) 21:05:08.54
アウトプットしないと身に付かないのは何でも一緒
311デフォルトの名無しさん:2012/07/23(月) 21:30:42.94
H本の11章のApplicative Functorがよくわかりません。
fmapってなんなのか謎です。助けてくださいお願いします。
312デフォルトの名無しさん:2012/07/23(月) 21:34:08.60
今手元にないけど、7章くらいのファンクタの説明ですでに出てきてるはず
313デフォルトの名無しさん:2012/07/23(月) 21:57:08.56
>>312
動作よくわかりません。fmapってmapと何が違うの?
314デフォルトの名無しさん:2012/07/23(月) 21:59:40.47
だいたい同じ
315デフォルトの名無しさん:2012/07/23(月) 22:41:05.39
>>313
入れ物っぽい動きをするデータ型の中身に関数を作用させるのがfmap
で、リストのfmapに特にmapと名前がついてるだけ

ていうかH本にそんな感じで書いてあったはずだが…
316デフォルトの名無しさん:2012/07/23(月) 22:42:02.10
入れ物って何だよわからん。
317デフォルトの名無しさん:2012/07/23(月) 22:45:56.02
もうちょい前から読み直せ、まじで
318デフォルトの名無しさん:2012/07/23(月) 23:29:36.85
>>313
実際の動作は型によってまちまち。
(a -> b) -> f a -> f b という型と若干の規則が共通しているだけ。
319デフォルトの名無しさん:2012/07/23(月) 23:56:19.91
次のようなことはができた。

data A a b = A a b
instance Functor (A a) where
  f `fmap` (A a b) = A a (f b)

次のようなことはできる?

instance Functor (A * b) where
  f `fmap` (A a b) = A (f a) b

* は一つ目の型引数に対して Functor を定義しているつもり。

もちろんこれはエラーなんだけど、意図は伝わったと思う。
GHC の拡張機能でできるようになる?
320デフォルトの名無しさん:2012/07/24(火) 00:24:48.07
type B b a = A a b
instance Functor (B b) where ...

でできないかな
321デフォルトの名無しさん:2012/07/24(火) 07:58:25.02
下の記述は引数3つ必要なのに
fmap (*3) (+100) 1

なぞこれは、引数2でいいの?
fmap (replicate 3) [1,2,3]

322デフォルトの名無しさん:2012/07/24(火) 08:09:46.54
>>321
fmap :: (Functor f) -> (a -> b) -> f a -> f b
だから、基本的にはfmapは引数を二つ取る関数
fmap (replicate 3) [1,2,3::Int]
なら、f=[], a=Int, b=[Int]だから返り値の型はf b=[[Int]]
fmap (*3) (+(100::Int))
だと、f=(->)Int, a=Int, b=Intだから返り値の型はf b=Int->Int
ここからIntを得るにはもう一つ引数を与える必要がある
323322:2012/07/24(火) 08:10:41.80
>fmap :: (Functor f) -> (a -> b) -> f a -> f b
これは
fmap :: (Functor f) => (a -> b) -> f a -> f b
の間違い
324デフォルトの名無しさん:2012/07/24(火) 20:14:32.46
(->)aがMonadのInstanceになってるのはクソ仕様。ゴルフしか用途無い
Readerモナドが欲しい時はnewtype R a b = R (a -> b)のようにコンストラクタを明記した形でだけ使わせるべき
325デフォルトの名無しさん:2012/07/24(火) 21:19:11.76
個人的には join (+) === (2*) みたいなことができて便利。
(r ->) がインスタンスになってたって困ることないだろう。
気にいらないなら明示的に Reader, runReader 使えばいいじゃん。
326デフォルトの名無しさん:2012/07/24(火) 21:38:02.81
>>325
> join (+) === (2*) みたいなことができて便利。

すげー。
327デフォルトの名無しさん:2012/07/24(火) 22:27:52.06
そんなコードを読まされる人のことも考えてあげてください
328デフォルトの名無しさん:2012/07/24(火) 23:05:03.73
そこまで難しくもないだろ
329デフォルトの名無しさん:2012/07/25(水) 00:32:26.57
join (+) === (2*)
よくわからない。何がすごいの?
330デフォルトの名無しさん:2012/07/25(水) 01:02:38.56
Haskellの難しさが何かに似てると思ったら、OOPの猫クラス犬クラスだ。
例えられれば例えられる程分からん。
331デフォルトの名無しさん:2012/07/25(水) 01:05:26.32
形式言語の理解に例えを頼るなよw
332デフォルトの名無しさん:2012/07/25(水) 01:08:47.29
頭の悪い俺には
定数の2を使わずに済む
圧倒的難読化効率
わざわざMonad ((->) a)のインスタンスをインポートしなければならない
ぐらいしか思いつかない
333デフォルトの名無しさん:2012/07/25(水) 04:23:23.00
join (+) === (2*)
この例だけがすごいわけじゃなくて、
f x x みたいに同じ引数を二回使うとき、
join f x と書けるということ。
ようは runReader なしで使える Reader モナドなので、
共通の引数を使い回せる。
334デフォルトの名無しさん:2012/07/25(水) 06:46:55.56
(\(a, b) -> (f a, f b))
を、ポイントフリーで
join (***) f
と書くのはたまに見る。俺は使わないけど
335デフォルトの名無しさん:2012/07/25(水) 07:30:14.88
runReaderとReaderモナドがなにかわからない。
H本に載ってないような?
336デフォルトの名無しさん:2012/07/25(水) 07:38:38.47
Readerモナド = 関数モナド
H本にも載ってるはず…
337デフォルトの名無しさん:2012/07/25(水) 14:03:27.24
モナxモナ
338319:2012/07/25(水) 19:26:48.34
>>320
こうしたらエラーが出た。

data A a b = A a b
type B b a = A a b

instance Functor (B b) where
  f `fmap` (A a b) = A (f a) b

エラーメッセージ
 Type synonym `B' should have 2 arguments, but has been given 1
 In the instance declaration for `Functor (B b)'

こっちは GHC 7.4.1 使ってる。
339デフォルトの名無しさん:2012/07/26(木) 12:12:16.64
2引数が必要やのに1個しかないやんけ!といってるだけやん
340319:2012/07/26(木) 12:38:04.82
>>339
いや、俺もそう思うんだが、>>320 がこれでできるんちゃうかと・・・

結局、>>319 の事はできるのかできないのか、どうなんだろ?
341デフォルトの名無しさん:2012/07/26(木) 15:05:07.43
さて本日はWindows環境でHDBC-postgresqlをインストールする手順をご説明致します
@PostgreSQLをインストールした場所のbinへパスを通します
 これはSetupがpg_config.exeを実行できるようにする為でございます

Acabalファイルのextra-libraries: 欄で、pq → libpq とします

BHaskellをインストールした場所のmingw\lib にliblibpq.aを用意しておきます
 これにはPostgreSQLをインストールした場所のlibからlibpq.dllをコピーして
 上記へリネームします
 
 インストール後は消して良いです

CPostgreSQLをインストールした場所のlibへパスを通します

 因みにlibにはlibpq.dllが、(@で通した)binにはlibpq.dllがさらに参照する2つの.dllがあります



以上で後は普通にセットアップして動く筈でございます
因みに私個人の環境は
Windows2000 SP4、Haskell Platform2011.4.0.0、HDBC-postgresql-2.3.2.1、PostgreSQL9.0.3でございます
342デフォルトの名無しさん:2012/07/26(木) 21:06:22.62
Justっていうのがよくわからん。
何故Just 3は、Just 3なの?
343デフォルトの名無しさん:2012/07/26(木) 21:15:08.58
哲学的すぎる…
344デフォルトの名無しさん:2012/07/26(木) 21:16:17.08
That which we call Just 3 by any other name would smell as sweet.
345デフォルトの名無しさん:2012/07/26(木) 21:42:08.68
シェークスピアみたい
346デフォルトの名無しさん:2012/07/26(木) 22:46:14.73
もしかしてJust 3にすると型になるの?
そうすると関数になるから色々な関数の引数に利用できるのかな?
347デフォルトの名無しさん:2012/07/26(木) 22:49:06.00
どこから突っ込めばいいやら
348デフォルトの名無しさん:2012/07/26(木) 22:53:10.85
すべてが型になる
349デフォルトの名無しさん:2012/07/26(木) 22:54:55.34
fromJust(Just 3)
すると3になるんだよ。すごいね
350デフォルトの名無しさん:2012/07/26(木) 22:59:40.02
そもそも型とは何かということをですね…
351デフォルトの名無しさん:2012/07/26(木) 23:53:20.39
型って何なの?
352デフォルトの名無しさん:2012/07/26(木) 23:55:31.66
類別、かな。
353デフォルトの名無しさん:2012/07/27(金) 00:14:48.20
>>352
じゃあHaskellの型って群なの?
354デフォルトの名無しさん:2012/07/27(金) 01:09:05.20
Just 3 すると、Maybe 型の値になるんだよ。Just の型を考えてみて。
355デフォルトの名無しさん:2012/07/27(金) 01:19:40.57
Just :: {3} -> Maybe
でしょうか?
356デフォルトの名無しさん:2012/07/27(金) 01:26:37.08
どこから突っ込めばいいやら
357デフォルトの名無しさん:2012/07/27(金) 01:28:03.19
そもそもhaskellがインストールされていないんだろう
358デフォルトの名無しさん:2012/07/27(金) 01:30:49.10
見放すべきか、教えてあげるべきか・・・
359デフォルトの名無しさん:2012/07/27(金) 01:36:06.29
>>355
ttp://www.amazon.co.jp/dp/4274068854
この本買ってきて頭から読むと良いよ、Maybeまでなら土日使えば辿りつけるはず
ここで散発的な質問するより絶対そっちの方が早いから
360デフォルトの名無しさん:2012/07/27(金) 08:08:49.03
すごいHのFunctorからモナドまでの説明はとても良いよね(´・ω・`)
361デフォルトの名無しさん:2012/07/27(金) 09:05:16.02
Hなモナ
ハアハア
362デフォルトの名無しさん:2012/07/27(金) 12:07:44.57
2012のffi何処行ってしもたん・・・
363デフォルトの名無しさん:2012/07/27(金) 12:44:49.63
Windows の 64bit 版をメイン使ってる人に質問
Haskell とはどうやってつき合ってる?

Windows 用 GHC のアルファ バージョン(64bit の実験もされてる)を使ってる?
GHC は 7.6 になるまで待って、今は Linux とデュアルブートしたり、
VMware 仮想環境上の Linux で GHC 64 bit版を使ってる?

思い切ってメモリ8GB、Windows7 64bit版を乗せたノーパソ買ったんだけど、
Windows 用 GHC の 64bit版がまだ正式には無い事に今さら気づいた (´・ω・`)
364デフォルトの名無しさん:2012/07/27(金) 13:06:14.88
ドアを叩く手前で悩んでいる人は結局それ以上伸びない
VMでもαでも本気で突き合いたいならどこでもできる
365デフォルトの名無しさん:2012/07/27(金) 13:25:16.31
ノーパソ喫茶
366デフォルトの名無しさん:2012/07/27(金) 16:18:20.48
>>364
伸びるとか、本気などのメンタル的な話ではなく、
実際に具体的にどの様に対応しているのかという話です。
併せて、32bit版にはない64bit版での運用上の問題点があれば、
それも聞いてみたいです。

>>364 はアルファ版も使ってみたのですよね。

例えば、大量のメモリを使ったりしたとき、
実用上問題にぶつかったとかあるでしょうか。
367364:2012/07/27(金) 16:46:39.18
知りません
368デフォルトの名無しさん:2012/07/27(金) 16:56:42.24
グラスゴーってイギリスだったんだな。サカーで始めて知った。
369デフォルトの名無しさん:2012/07/27(金) 17:26:33.50
マンチェスター
リバプール
デボンシャー
ウェールズ

仲間はずれはどれでしょう?
370デフォルトの名無しさん:2012/07/27(金) 17:29:18.19
そんなことよりケントはどうした、ケントは。
371デフォルトの名無しさん:2012/07/27(金) 18:39:53.88
>>363
32bit版GHCじゃ困る理由があるの?
372デフォルトの名無しさん:2012/07/27(金) 18:51:50.90
>>367
どうして知らないのでしょうか。

>>363 で、Windows の 64bit 版をメイン使ってる人に
Haskell とはどうやってつき合ってるのかを聞いて、
>>364 でそれに応じているので、当然使ってると思ったのですが。

しかも、VMでもαでも本気で突き合いたいならどこでもできる事を知っている。
自分で体験されたから知っているのではないのですか。

ひとの受け売り、また聞き、何となく脳内妄想、といった類なのでしょうか。
でしたら残念です。
373デフォルトの名無しさん:2012/07/27(金) 20:07:21.51
なにこのくだらないやり取りw…
374デフォルトの名無しさん:2012/07/27(金) 20:23:08.45
>>373
すまんすまん
>>364 の的外れな返答についカッとなってしまった。

質問をちょっと変えて、的を絞るわ。

Windows7 64bit 版で GHC 64ビット版を使う方法はいくつかありそうですが、
処理速度をできるだけ落とさないように、という主眼だと、
どの方法がベターでしょうか?
375デフォルトの名無しさん:2012/07/27(金) 20:30:51.31
>>371
32bit版のGHCだと、メモリを大量に使えなかったりしません?

ちょっと大きめサイズで移流拡散現象をシミュレートしたくて、
Windows7の32版でやったら使えるメモリが足りず、
満足いくシミュレーションができなかったんです。

64bit版のWindows + 32bit版GHC で8GBメモリとか使えるのなら、
それで問題ないのですけど。

今はマシンが手許になくて試すことができない状態です。
376デフォルトの名無しさん:2012/07/27(金) 21:08:25.31
ドアを叩く手前で悩んでいる人は結局それ以上伸びない
377デフォルトの名無しさん:2012/07/27(金) 21:10:01.43
>>375
メモリ8G使いたいなら確かに64bit版をなんとかして使うしかないな、納得
378デフォルトの名無しさん:2012/07/27(金) 21:25:51.33
>>375
俺以外にも移流拡散解析をHaskellでやろうとか思う奴がいるとは、、、
379デフォルトの名無しさん:2012/07/27(金) 22:34:10.85
シミュレーションでメモリが云々でノーパソ。。。
380デフォルトの名無しさん:2012/07/27(金) 23:32:50.02
アプリカティブちゃんと仲良くできません。
こ難しいインテリで付き合いにくいで
何とか理解する方法ないでしょうか?
381デフォルトの名無しさん:2012/07/27(金) 23:35:32.40
>>380
無理矢理ヤれば、そのうちアプリカティブちゃんのほうから腰振ってくるよ
まずはヤってみろ
382デフォルトの名無しさん:2012/07/28(土) 00:24:39.83
vm player にubuntu 64bit入れて、その上のHaskell弄るとか。
383デフォルトの名無しさん:2012/07/28(土) 00:31:59.82
>>380
do記法の<-を普通の変数束縛のlet構文だと思ってみると
do { f <- mf ; x <- mx ; return f x }
これが
let f = mf in let x = mx in f x
こうなる。実際Identityモナドのdo記法とlet式は意味的には同等。
しかし変数束縛を使わずにこう書きたいこともある。
mf mx
これに相当するものがApplicativeを使うとこう書ける。
mf <$> mx
つまりApplicativeを使えば変数束縛が減らせゴルフコードが書きやすくなるということ。
384383:2012/07/28(土) 00:34:50.86
スマン型がちょっと違うわ。。。誰か訂正頼む。。
385訂正:2012/07/28(土) 00:56:52.15
>>380
do記法の<-を普通の変数束縛のlet構文だと思ってみると
do { x1 <- mx1 ; x2 <- mx2 ; return f x1 x2 }
これが
let x1 = mx1 in let x2 = mx2 in f x1 x2
こうなる。実際Identityモナドのdo記法とlet式は意味的には同等。
しかし変数束縛を使わずにこう書きたいこともある。
f mx1 mx2
これに相当するものがApplicativeを使うとこう書ける。
f <$> mx1 <*> mx2
つまりApplicativeを使えば変数束縛が減らせゴルフコードが書きやすくなるということ。
386デフォルトの名無しさん:2012/07/28(土) 02:01:13.63
足し算を定義すると
Prelude Control.Applicative> let add = (+)
Prelude Control.Applicative> add 3 4
7

Maybe上の足し算ができちゃう><
Prelude Control.Applicative> add <$> Just 3 <*> Just 4
Just 7

リストモナド上で多値の足し算もできちゃう><
Prelude Control.Applicative> add <$> [1,2,3] <*> [10,20,30]
[11,21,31,12,22,32,13,23,33]



まあ読み書きやすくした部分がapplicativeだけどさ
387デフォルトの名無しさん:2012/07/28(土) 08:47:57.97
モナド分かってる前提で説明していいんだろうか
388デフォルトの名無しさん:2012/07/28(土) 09:15:47.98
モナドとモノイドは何が違うの?
389デフォルトの名無しさん:2012/07/28(土) 09:22:51.23
モノイドは項。モナドは文脈を持った値に対する関数適用。
390デフォルトの名無しさん:2012/07/28(土) 16:11:08.07
haddockってもしかしてpaddock捩ってんの?
391デフォルトの名無しさん:2012/07/28(土) 17:20:35.96
haddockは鱈
392デフォルトの名無しさん:2012/07/28(土) 18:40:30.26
haddock haddock してんじゃねーよ!
393デフォルトの名無しさん:2012/07/28(土) 21:02:13.68
operationalモナドとかfreeモナドの話はどこで読めますか?
394デフォルトの名無しさん:2012/07/28(土) 21:58:11.97
395デフォルトの名無しさん:2012/07/28(土) 22:14:58.18
>>394
ありがとう。
396デフォルトの名無しさん:2012/07/29(日) 13:51:01.38
このすれ来て大分モナドわかってきた
397デフォルトの名無しさん:2012/07/29(日) 13:52:53.80
次は福岡モナドだな
398デフォルトの名無しさん:2012/07/29(日) 17:51:00.77
存在し無い概念の翻訳が難しい。
「 と」とか「 くさ」とか。
399デフォルトの名無しさん:2012/07/29(日) 19:26:20.44
javascriptでモナってみる
400デフォルトの名無しさん:2012/07/29(日) 19:59:37.88
文脈ってなんなのかよくわからない。
型が文脈持つってなんなの?
401デフォルトの名無しさん:2012/07/29(日) 21:03:27.45
monadとはインタプリタを作る方法で、文脈というのはインタプリタの能力だと思えば良い。
変数への破壊的代入を行えるインタプリタも行えないインタプリタもあるように、
変数への破壊的代入を行える文脈も行えない文脈もある。
例えばIOモナドを使うとIOの順序がsequentialになるが、
これはIOモナドがstrictな言語のインタプリタだからだと解釈できる。
(ただしhttp://www.haskell.org/haskellwiki/What_a_Monad_is_notの
Monads are not about strictnessにあるように、non-strictな言語のインタプリタだって作れる)
402デフォルトの名無しさん:2012/07/29(日) 21:22:56.50
「破壊的かもしれない文脈」を略して「文脈」というのか
403デフォルトの名無しさん:2012/07/29(日) 21:36:40.77
いや、いわない
404デフォルトの名無しさん:2012/07/29(日) 21:54:06.03
data Maybe a = Just a | Nothing
これが「成否」のコンテキストなんだけど。

「成否」というコンテキストの中での値が、「否」なら値なし、「成」ならa型の値。
これは抽象データ「型」でしょ?
この抽象データ型は、a型の値に「成否」コンテキストを付与してる。
別に難しいことじゃないよね。
405デフォルトの名無しさん:2012/07/29(日) 22:21:47.70
コンテクストをコンテクストという用語を用いずに説明求む
406404:2012/07/29(日) 22:37:14.66
コンテキストで説明したけど?
407デフォルトの名無しさん:2012/07/29(日) 22:39:27.96
ワロスwwww
408デフォルトの名無しさん:2012/07/30(月) 01:34:58.73
バカ晒し上げ
409デフォルトの名無しさん:2012/07/30(月) 02:38:13.45
文脈の意味がわかんねって言ってる奴は、
実は『日本語としての』文脈の意味がわかんねって言いたいんじゃね 。>>405とか見る限り
辞書引いてください
410デフォルトの名無しさん:2012/07/30(月) 05:36:18.38
何言ってるのかわからないw
411デフォルトの名無しさん:2012/07/30(月) 12:41:29.26
>>400
型が文脈そのもの。持つのではない。
ラップされることで文脈を持つのは値の方。
412デフォルトの名無しさん:2012/07/30(月) 14:29:08.97
>>400
文脈を持った型というよりも文脈を持った値として考えるべきじゃね。
そこでいう型は別に大事じゃない。関数適用したら別の方に簡単に変わるし。
大事なのはあくまでも文脈。
文脈を持った値というのは文脈を持つコンテナに包まれてる値としてもいいかも。
その文脈についての実装をbindとかで実装することでその文脈として適した振る舞いをすることができる。
413デフォルトの名無しさん:2012/07/30(月) 17:51:46.46
型は型で重要なんだけど。
代数データ型で文脈を定義しているので。

それから>>404のMaybeは、定義の形を見れば明らかだが、
要素が一つしかないコンテナとみなせる。
つまりコンテナ型は文脈でもある。
だからリストモナドというものがある。
> 文脈を持った値というのは文脈を持つコンテナに包まれてる値としてもいいかも。
というのは相当おかしい。
414デフォルトの名無しさん:2012/07/31(火) 00:38:45.92
>>412
うーんよくわからけど、Maximaの事実と文脈みたいなものなのかな?
ある値や関数にMaybeという事実を適用した結果は、失敗するかも
しれないという事実の集合である文脈を返すことができるってことなのかな?難しい
415デフォルトの名無しさん:2012/07/31(火) 00:55:53.18
>>414
なぜ不正確な話をしている412にレスしているのかわからんし、
> ある値や関数にMaybeという事実を適用した結果は、失敗するかも
もうちょっと落ち着いて、解説ドキュメントを正確に理解するようにしたら?
416デフォルトの名無しさん:2012/07/31(火) 10:02:54.99
モッジさんの論文では
コンテキスト付きの値というよりcomputationという表現を使ってるな
m aだとaという型の値を主軸にした何らかの計算(実際にaを通常の値として取り出せるとは限らない)というイメージか
コンテキストと聞くとどちらかというとcomonadをイメージしてしまうね
コモナドの場合はw aという値からaは「必ず」取り出せる
417デフォルトの名無しさん:2012/07/31(火) 13:32:22.97
>>413
別にリストモナドとかも
> 文脈を持った値というのは文脈を持つコンテナに包まれてる値としてもいいかも。
で、おかしくなくない?
418デフォルトの名無しさん:2012/07/31(火) 17:18:32.38
コンテナの場合、
コンテナが文脈そのもので、
コンテナが文脈を持つのではない。
419デフォルトの名無しさん:2012/07/31(火) 19:35:51.55
>>418
リストもなどでも、結果を順列として出すのか組み合わせとして出すのかなど文脈を変えることはできるけど?
420デフォルトの名無しさん:2012/07/31(火) 20:01:58.39
文脈の定義が曖昧だから水掛け論にしかならない印象
421デフォルトの名無しさん:2012/07/31(火) 20:29:53.64
>>419
その例だとリスト自体が文脈を表現してるじゃないですか。
422デフォルトの名無しさん:2012/07/31(火) 20:59:52.58
型だけじゃなくて>>=とreturnも合わせてモナドなんじゃないの?
型だけでは表現できないような、どうやって使うのか、という意味を>>=に込めていると理解していたのだけれど。
List型は0個以上の値の並びっていう意味しか込められないけど、
0個以上の値を返す計算を繋げるんだよーっていう文脈が>>=で伝わるっていうような。

Listで作れるモナドってconcatMapしか無いのかな?もしあってもHaskellはinstanceにしてくれないけど。
423デフォルトの名無しさん:2012/07/31(火) 21:44:11.69
>>421
同じリストというコンテナでも、順列か組み合わせかなど文脈を変えることが出来る。
>>422の言うようにbindとreturn合わせてのモナドというのが正しいんじゃない?
424デフォルトの名無しさん:2012/07/31(火) 22:04:39.61
モナドがどういうものであるかは別の話。

文脈が固定されてないのは、単純なMaybeの例でさえJustとNothingがあり明らか。
なぜそんなことを言い始めるのか理解不能。
http://learnyouahaskell.com/for-a-few-monads-more
この辺から勉強し直すと良い。

リストを値と考えて、それにOrderdなどの制約を化した操作群を考える場合、
それはリストの要素に対してでなく、リストに対してコンテキストを付与したことになっている。
>>417はその階層を混同している。
425デフォルトの名無しさん:2012/07/31(火) 22:34:15.79
>>422
Haskellのモナドは数学のモナドではない気がするのは俺だけか…
426デフォルトの名無しさん:2012/07/31(火) 23:09:27.62
>>422
リストで作れるモナドは少なくとももう一つある(と思う)
ZipListというReaderみたいなやつ

import Data.List
import Data.Maybe

newtype Alt a = Alt [a]
  deriving Show

instance Monad Alt where
  return x = Alt $ repeat x
  Alt xs >>= f = Alt $ takeWhileJust $ zipWith g [0..] xs
    where
      g i x = case f x of
        Alt ys -> ys `at` i

at :: [a] -> Int -> Maybe a
at xs n = listToMaybe $ drop n xs

takeWhileJust :: [Maybe a] -> [a]
takeWhileJust = foldr f []
  where
    f (Just x) rest = x : rest
    f Nothing _ = []
427デフォルトの名無しさん:2012/08/01(水) 00:33:21.60
言語の練習がてらwebサイト生成するシステム作ってみようと思うんですけど
PHPやperlと比べた時のhaskellの優位性ってどんなところにあるんでしょうか?
428デフォルトの名無しさん:2012/08/01(水) 00:45:54.14
>>427
日本語対応が完璧
どこのレンタルサーバでもインストールされてる
正規表現によるマッチングがファーストクラス
429デフォルトの名無しさん:2012/08/01(水) 00:50:22.38
>>427
言語の練習がてらという目的とは必ずしも合致しませんが、
Haskell には Yesod という Web フレームワーク ライブラリがあり、
これが Web サイト構築の手間をかなり省いてくれます。
(Web フレームワークは他にもいくつかありますが)

で、このライブラリが Web フレームワークをプログラマに提供するために
Haskell の様々なテクニックを駆使しています。
テンプレート Haskewll 然り、ストリームデータに対する考え方然り。
このようなテクニックのおかげで、末端のプログラマは、
Web ページの見た目やサイトの表層的な構成に縛られない「直感的」な記述で、
Web サイトを Haskell のコードとして定義できます。

そのことにより、もともと Haskell が持っていた他言語に対する利点が、
そのまま Web サイトの構築に生かせるという点が haskellの優位性になります。
たとえば参照透過性や遅延評価などですね。
430デフォルトの名無しさん:2012/08/01(水) 01:22:11.10
橋の下に捨てられた「すごいH」本を高校生が (*´д`) ハァハァ しながら読む光景
431デフォルトの名無しさん:2012/08/01(水) 01:59:34.98
>>425
HaskellのWikibookにのってる unit と join を使った説明は数学のモナドそのもの
432デフォルトの名無しさん:2012/08/01(水) 21:55:56.60
>>431
モナドというより、カルテシアン閉と言った方が正確な気が…
433デフォルトの名無しさん:2012/08/01(水) 22:24:36.67
カルテシアン閉圏に近いのはArrow
欲を言えばGArrow
434デフォルトの名無しさん:2012/08/01(水) 22:28:29.78
Haskellは圏論知ってないと身につかないよね?
435デフォルトの名無しさん:2012/08/01(水) 22:32:21.04
もういい加減その迷信は騙されてる方に問題がある
436デフォルトの名無しさん:2012/08/01(水) 22:36:33.95
>>434
圏論を知らないと意味を解釈できないライブラリがあるのは確かだが、圏論の知識がない人が同じモノをHaskellで作ることはできる
Haskellにおける圏論は、算数の九九で言うと数学基礎論みたいなもんだから、必須知識ではない
437デフォルトの名無しさん:2012/08/01(水) 22:37:32.23
>>435
トポスなんてHaskellの本に出てこないけど
ここでは一般常識なんでしょ?
438デフォルトの名無しさん:2012/08/01(水) 22:40:37.48
>>437
ここでトポスが一般常識になっていると感じたレスって、たとえばどれ?
439デフォルトの名無しさん:2012/08/01(水) 22:48:23.80
トポスってチョコたっぷりのあれ?
440デフォルトの名無しさん:2012/08/01(水) 22:58:11.29
論理はトポスと言っても間違いではない
しかし、Haskellはトポスではない
441デフォルトの名無しさん:2012/08/02(木) 01:47:08.46
トポスは1階述語までならλ抽象を表現できるから、Haskellはトポスではないが、トポスはHaskell
442uy:2012/08/02(木) 13:23:21.74
僕の考えたモナド()
443デフォルトの名無しさん:2012/08/02(木) 17:59:53.21
>>7
■ mathematica
{1,2,3,4,5}~Select~(2<#<5&) 2

■ matlab
x=[1 2 3 4 5]; x(2<x&x<5).*2
444デフォルトの名無しさん:2012/08/03(金) 10:15:14.99
>>443
短いがあまり美しくないな
445デフォルトの名無しさん:2012/08/03(金) 10:20:39.59
短いコードよりも、オーソドックスなコードの比較の方がうれしいのは私だけか…
446デフォルトの名無しさん:2012/08/03(金) 16:00:51.90
(for [x (range 1 6) :when (and (> x 2) (< x 5))] (* 2 x))
447デフォルトの名無しさん:2012/08/03(金) 16:02:10.76
↑Clojure
448デフォルトの名無しさん:2012/08/03(金) 16:08:17.05
Haskellのすべてを圏論的に再現しようとするからCCCとか初等トポスだとかの話になるけど、
FunctorやApplicativeを理解するためにそこまでのガチガチの議論は必要ない。
449デフォルトの名無しさん:2012/08/03(金) 16:31:07.15
どうしてこういう定義・言語仕様にすると巧く行くんだろうとか考え出すと嵌るね
450デフォルトの名無しさん:2012/08/03(金) 16:52:10.75
既存c++libraryを活用できますか?
451デフォルトの名無しさん:2012/08/03(金) 19:07:04.32
活用できるものもあれば、それだけでは活用できないものもある
452デフォルトの名無しさん:2012/08/03(金) 19:52:47.73
Mathematica で ~ 使ってるのあんまりみない。

普通は↓こんな感じ

Select[Range[1, 5], 2 < # < 5 &]*2
453デフォルトの名無しさん:2012/08/04(土) 00:54:29.03
>>7
■ Scheme
(print (list-ec (: x 1 6) (if (< 2 x)) (if (< x 5)) (* x 2)))
454デフォルトの名無しさん:2012/08/05(日) 12:07:58.01
sodium以外のhaskell用のFRPライブラリは完全に更新停止ですな
455デフォルトの名無しさん:2012/08/05(日) 12:37:56.76
結局はやらないからな
456デフォルトの名無しさん:2012/08/05(日) 20:17:39.53
FRPはオワコン以前に始まってすらいない感が凄い
発祥の古さを考えると信じられない
457デフォルトの名無しさん:2012/08/06(月) 00:33:50.34
GUIとの統合がまだまだだから仕方ない。
ウインドウにボタン一つならいいんだろうが。
458デフォルトの名無しさん:2012/08/06(月) 14:37:17.32
gtk2hsとcairoで画面描画したいのだけど、Gtk2Hsの公式のほかに
お勧めのtutorialサイト知ってる所あったら教えて。英語もおkです。
459デフォルトの名無しさん:2012/08/06(月) 19:08:38.08
チュートリアルはないね。

公式ので十分じゃないか。
あとは GTK のドキュメントとチュートリアル見て、
gtk2hs のライブラリ ドキュメントから使い方を推理して、
試行錯誤しながら使っていくしかないと思う。
460458:2012/08/06(月) 19:41:43.49
やはり、そんなもんなのか。。。。
黄色線の三角形描くやつやってみて、さらにもうちょい無いかなと思ったんだけど。
小さな描画サンプルコードいくつか見つけたので、その辺弄ってみるよ。

レスありがと
461デフォルトの名無しさん:2012/08/06(月) 23:05:35.86
>>454
Yampa はまだ更新されてると思うが。
つい最近も3月末に更新されたし。
462デフォルトの名無しさん:2012/08/06(月) 23:13:29.87
更新止まったというのは、バグがなくなったという意味なのか、バグだらけでもう見ることすら嫌になったという意味なのか
463デフォルトの名無しさん:2012/08/06(月) 23:16:00.55
ユーザが少ないのでバグが発見されない、とか
464デフォルトの名無しさん:2012/08/06(月) 23:24:56.21
ハスケルてmmorpg作れる?
465デフォルトの名無しさん:2012/08/06(月) 23:28:50.30
haskellで作れないのは子供くらいなもんです
466デフォルトの名無しさん:2012/08/06(月) 23:35:53.20
じゃあ彼女の作りかたを教えてくれ
467デフォルトの名無しさん:2012/08/06(月) 23:51:18.77
サーバー1台に100000人収容するんだが
知り合いにきいたらealangをすすめられた
そんでついでにハスケルもいけるかもときいたのでここで質問してみました
468デフォルトの名無しさん:2012/08/06(月) 23:55:08.30
ちなみにphpで100000人さばくにはサーバー200台必要になるそうです
469デフォルトの名無しさん:2012/08/07(火) 00:17:37.95
その用途でもerlangの方が実績ある
470デフォルトの名無しさん:2012/08/07(火) 01:19:18.31
F#でいい気がしますよ(´・ω・`)
471デフォルトの名無しさん:2012/08/07(火) 01:39:28.26
erlangは企業が開発して現場で使ってたヤツだから実績があるのは当然

erlangのメッセージ渡しの並列処理はHaskellも取り入れてほしい
MVarは使いにくい
472デフォルトの名無しさん:2012/08/07(火) 08:44:11.80
早く対応を謳っておきながら
Windows2000で最新版Haskell PlatformのWin32パッケージが
正しくインストールされていない不具合を修正するんだ!
473デフォルトの名無しさん:2012/08/07(火) 08:45:52.38
Win2Kなんてとっとと切りすててリソース節約すべき
474デフォルトの名無しさん:2012/08/07(火) 08:57:40.42
Haskellの軽量スレッドってやつですか
475デフォルトの名無しさん:2012/08/07(火) 12:13:10.44
ハスケルで作った実行バイナリにはランタイムシステム同梱されるじゃん?
このビッグブラザーがOSとの間を牛耳ってる限りC/C++に勝てないじゃん?
476デフォルトの名無しさん:2012/08/07(火) 12:30:27.35
Parallel Studioとか使ってガチでチューニングするなら確かにそうだな
そこまでする必要が無いと言うなら作業量との兼ね合いでrtsによるオーバーヘッドも無視できる場合も多々ある
477デフォルトの名無しさん:2012/08/07(火) 18:45:01.55
おもしろそう

http://www.fos.kuis.kyoto-u.ac.jp/sig-ppl/index.php?ss2012
PPLサマースクール2012 関数型言語ベースの先進的Webフレームワーク
478デフォルトの名無しさん:2012/08/08(水) 01:17:29.99
日本語処理とディスパッチさえちゃんと動けばyesod使うのに…
479デフォルトの名無しさん:2012/08/08(水) 13:06:38.83
不具合についてkwsk
俺も試そうと思ってるから先に試した人が遭遇した不具合は気になる
480デフォルトの名無しさん:2012/08/10(金) 13:35:41.80
本物のプログラマはHaskellを使う
ttp://itpro.nikkeibp.co.jp/article/COLUMN/20060915/248215/?ST=ittrend

書籍化して欲しい
481デフォルトの名無しさん:2012/08/10(金) 16:46:36.38
>>480
ア ニ メ 化 決 定
482デフォルトの名無しさん:2012/08/11(土) 10:51:05.63
handleSqlError内でDBに接続して更新中にエラー発生したらfailしますよね
disconnectはしなくていいのですか?
483デフォルトの名無しさん:2012/08/11(土) 10:53:33.10
ああしなきゃ駄目かな

with〜でエラーハンドラと共に接続するんですかね
484デフォルトの名無しさん:2012/08/11(土) 11:17:31.21
ああ違う
with〜で渡すのはメインプロセスの方か
485デフォルトの名無しさん:2012/08/11(土) 11:49:21.16
おk 理解した ありがとう
486デフォルトの名無しさん:2012/08/11(土) 13:01:00.87
どういたしました
487デフォルトの名無しさん:2012/08/12(日) 09:53:57.10
どうでも良いけど、今更気づいた。

Yesod のロゴマークって、Haskell のそれを
ほぼ上下逆さまにしたものなんだ(横線1本増えて、形も微妙に違うけど)
488デフォルトの名無しさん:2012/08/12(日) 22:54:29.02
runInputT defaultSettings $ getPassward (Just '*') "PASS: " >>= liftIO . print


PASS:
Just ""

これ仕様なの?
何も入力しなかったらNothing を期待してたんだけど
だって空文字のパスワードなんてあっていいの? って話じゃん
489デフォルトの名無しさん:2012/08/13(月) 00:18:35.58
Ctrl-D(EOF)じゃなくてリターンキー押したんじゃないの?
490デフォルトの名無しさん:2012/08/13(月) 00:24:34.16
空文字のパスワードを入力したなら空文字列は正しい
どんなパスワードを許容するかというポリシーは、パスワードを受け取るメカニズムとは分離すべき
491488:2012/08/13(月) 00:57:37.33
>>489
Ctrl-D はInterrupted になるでしょ

>>490
そうなのか
じゃあ Nothing はいつ出番あるの?
492デフォルトの名無しさん:2012/08/15(水) 02:22:06.28
HDBCでSqlErrorのseErrorMsgがぶっ壊れてるんです
これはHaskell処理系がDBから返ってくる日本語文字列を正しく取り込めないことに起因してそうです
これはどうしようもないのでしょうか?

私が普段Shift-JISコンソールで日本語文字列を扱う時は
ソースの日本語文字列をUTF8で書いて
それをUTF8を正しく扱うライブラリの力を借りて取り込んで
さらにiconvライブラリでShift-JISに変換しています

HDBCライブラリの方で正しく取り込んでくれない限り
こちらは手の出しようが無いのでしょうか?


HDBCはLatin-1しか扱うつもりがないのですか?
救済措置はないのですか?
493デフォルトの名無しさん:2012/08/15(水) 07:44:16.26
ああああああ文字エンコードの問題ってマジ糞忌々しいわああああ

く・そ・い・ま・い・ま・し・い!!!
494デフォルトの名無しさん:2012/08/15(水) 07:45:52.09
ファンファンファーマシーみたいな言い方やめろ
495デフォルトの名無しさん:2012/08/15(水) 08:28:54.22
HDBC, UTF-8は何の問題もない。
逆にRDBがUTF-8じゃないとかなり面倒。
496デフォルトの名無しさん:2012/08/15(水) 11:31:34.40
サーバーはUTF-8ですが返ってきたSqlErrorのseErrorMsgが
無効文字だから置き換えた事を意味する0xfffdを連発してるんです。。。

connectPostgreSQL: FATAL: ユーザ"postgres"のパスワード認証に失敗しました

となるところを

connectPostgreSQL: FATAL: \65533\65533\65533[\65533U"postgres"\65533\771p\65533X\65533\65533\65533[\65533h\65533F\65533\1538\590\65533\65533s\65533\65533\65533\1794\65533\65533\65533

となります
これはもうぶっ壊れてるでしょう?
直せないでしょう?
497デフォルトの名無しさん:2012/08/15(水) 12:14:42.54
関係ないが、JavaでLinuxでMySQLに接続するときにJDBCに文字コード関連のバグがあって開発が3年中断してるのを思い出した
498デフォルトの名無しさん:2012/08/15(水) 12:40:17.82
どうやらHDBC-postgresql-2.3.2.1 は 8.x 用でした
僕のPostgreSQL は 9.0.3 でした
てへぺろ
499デフォルトの名無しさん:2012/08/19(日) 02:07:11.79
{-# LANGUAGE RecordWildCards #-}
data A = A Int Int deriving Show
main = let f1 = 0
       f2 = 0 in print A{..}

[1 of 1] Compiling Main ( *.hs, *.o )
Linking *.exe ...

*.exe: rec.hs:7:14-18: Missing field in record construction

RecordWildCards危なすぎだろ……
500デフォルトの名無しさん:2012/08/19(日) 06:57:20.49
-Wallでもフィールド未初期化の警告出ないのか、これは危ない
バグ報告しようぜ
501デフォルトの名無しさん:2012/08/19(日) 12:03:18.94
っていうか、これでも通るんだけど

{-# LANGUAGE RecordWildCards #-}
data A = A Int Int deriving Show
main = print A{..}
502デフォルトの名無しさん:2012/08/19(日) 12:04:49.44
Haskell is UnSafe!!!
503デフォルトの名無しさん:2012/08/19(日) 12:43:33.46
もしかしたらワイルドカードは、単に同スコープ内にある、
フィールド名と同名の変数があればそれに展開される機能であって、
同名の変数がなければ「何も展開されない」機能なのかな。

>>500 の言うように、警告くらいは出すべきだと俺も思う。
ただ、未初期化じゃなくて、展開できないフィールドかあれば、だけど。


ただ、これ一つを以て Haskell is UnSafe!!! というのは如何かと思う。
デフォルトではなく、まして GHC の独自拡張なんだし。
504デフォルトの名無しさん:2012/08/19(日) 13:01:24.09
GHC is UnSafe!!!
505デフォルトの名無しさん:2012/08/19(日) 13:17:49.77
でも、これで unsafe と言うのなら、
その前に遅延パターン(irrefutable pattern)の時点で unsafe になるな・・・

遅延パターンは Haskell 98 の時点で Haskell の公式だし
506デフォルトの名無しさん:2012/08/19(日) 13:22:43.13
Haskell has been UnSafe since 1998!!!
507デフォルトの名無しさん:2012/08/19(日) 13:36:12.01
>>503
普通のレコード型に対してならワイルドカードの未初期化警告が出るよ
>>499みたいになるのはフィールドラベルのないデータ型だけ

{-# LANGUAGE RecordWildCards #-}
data A = A {f1, f2 :: Int} deriving Show
main = print A{..}

[1 of 1] Compiling Main ( test.hs, test.o )

test.hs:3:14:
Warning: Fields of `A' not initialised: f1, f2
In the first argument of `print', namely `A {..}'
In the expression: print (A {..})
In an equation for `main': main = print (A {..})
Linking test ...
508デフォルトの名無しさん:2012/08/19(日) 17:51:55.10
フィールドがstrictなら(A = A !Int !Intなら)普通に弾かれるんだな。
つまりRecordWildCardsの束縛を不可反駁で「なく」する拡張があればすべて解決する……?
509デフォルトの名無しさん:2012/08/19(日) 18:45:29.12
いや、フィールドラベルのない型に...が使えるのは単なるバグじゃね
510デフォルトの名無しさん:2012/08/20(月) 05:10:43.35
Haskell 98 is dangerous!!!
511デフォルトの名無しさん:2012/08/20(月) 05:19:54.47
Dangerous Beauty?
512デフォルトの名無しさん:2012/08/20(月) 05:29:24.69
Haskell 98 is too dangerous a language to use!!!
513デフォルトの名無しさん:2012/08/20(月) 06:02:33.15
The agitation has successfully accomplished!!!
514デフォルトの名無しさん:2012/08/20(月) 06:04:34.53
Haskell!! Dangerous!! Haskell!! Dangerous!!1!
515デフォルトの名無しさん:2012/08/20(月) 23:00:48.76
fack you
516デフォルトの名無しさん:2012/08/21(火) 03:58:06.31
λx.x) <ラムダマンだよ
517デフォルトの名無しさん:2012/08/21(火) 07:17:10.05
>>516
人( ・∀・)
518デフォルトの名無しさん:2012/08/23(木) 02:03:55.49
スパゲッティすぎてソース終えん
519デフォルトの名無しさん:2012/08/23(木) 03:20:29.68
遅延評価すぎていつ何を評価してるかおえん
520デフォルトの名無しさん:2012/08/23(木) 06:29:33.19
パフォーマンスバグを調べてるとかでない限り、評価がいつ起こるか気にする必要はないよ
521デフォルトの名無しさん:2012/08/23(木) 20:11:16.48
>>520
データサイズの増加と計算時間の予測が難しくなるのはつらい
522デフォルトの名無しさん:2012/08/23(木) 20:58:22.63
使いこなせない道具に固執するのはやめろ。
さもなくば学べ。
523デフォルトの名無しさん:2012/08/23(木) 21:12:33.07
>>522
そんなレスするくらいなら、
データサイズの増加と計算時間の予測方法を提示した方が、
議論が良い方向に進むのではないか?

私はその点に関して知識が無く何も提示できないから黙っておくが
524デフォルトの名無しさん:2012/08/23(木) 21:27:57.23
遅延評価のせいで実行時間予測がC言語と異なるのは確か
特に途中経過出力するときの時間が違う
525デフォルトの名無しさん:2012/08/23(木) 21:44:01.41
計算量は、遅延評価でも、正格評価のときの計算量のオーダー以上は増加しない。
空間量は、遅延評価でも、正格評価のときの計算量のオーダーと空間量のオーダーのより大きいほう以上は増加しない。

たいていのアルゴリズムは(すべてのアルゴリズムは?)、遅延評価でも正格評価でも、計算量のオーダーは空間量のオーダーと同じか、それより大きい。

そういった証明とかは知らないけど、たぶん、こうだと考えている。
526デフォルトの名無しさん:2012/08/24(金) 01:58:34.59
>>525
正格での場合の総計算量のうち必要な空間量とか、この時点で想定される計算時間が遅延故に全く異なることになるからな。
まぁ確かにこうすれば、そのへんの増大に悩まされないですむよって方針を教えてもらったほうが役に立つわな。
527デフォルトの名無しさん:2012/08/24(金) 04:05:15.34
パラレルと遅延評価って相性悪いんじゃなかろうか

遅延評価って、やったことにして本当に必要になるまで動き出さないで次行くじゃん
モナドにしたって順序の保証こそすれ
いつ動くかは保証しないじゃん

これパラレルという概念に真っ向から唾を吐くものじゃないの?
528デフォルトの名無しさん:2012/08/24(金) 04:11:31.95
単純に Debug.print を入れると計算時間が変わるのが困る
529デフォルトの名無しさん:2012/08/24(金) 05:02:59.24
>>527
そしてバッドノウハウのように生まれたのがNFDataなのでした
まあ普通に便利だけどねNFDataは
530デフォルトの名無しさん:2012/08/24(金) 08:36:12.07
>>528
java の DTrace みたいなのが欲しいねーって
おい Haskell にも DTrace があるじゃんよ
531デフォルトの名無しさん:2012/08/24(金) 11:24:02.75
>>527
並列同期と遅延評価は表裏一体。
532デフォルトの名無しさん:2012/08/24(金) 11:50:46.76
>>527
副作用をなくすからこそ、遅延評価でよくてパラレルにも出来るのだから、IOモナドとか入る箇所はそれ相応の注意を払わないかんのは仕方ないよね
533デフォルトの名無しさん:2012/08/24(金) 12:52:30.38
ガベージコレクトを促すにはどうすれば良いでしょうか。

ghc 7.4.2 です。
534デフォルトの名無しさん:2012/08/24(金) 13:47:21.12
>>533
Haskell処理系を作るしかないかと
535デフォルトの名無しさん:2012/08/24(金) 21:33:21.71
>>533
System.Mem.performGC
536533:2012/08/24(金) 21:51:49.46
System.Mem にあったんですね。
見逃していました。

なんか、GHC の Wiki 見てると、
アルゴリズムとしては世代別 GC を使っている感じなのですが、
その辺りのコード内での制御はまだできなさそうですね。

とにかく、ガベージコレクトを促すことができるだけでも助かりました。
ありがとうございました。
537デフォルトの名無しさん:2012/08/26(日) 01:56:32.70
HaskellのGC技術はJavaに何年遅れていますか?
538デフォルトの名無しさん:2012/08/26(日) 02:12:43.83
GCはHaskellの方が5年早くね?
539デフォルトの名無しさん:2012/08/26(日) 02:56:31.79
Javaはconcurrent GCとかあって羨ましい
540デフォルトの名無しさん:2012/08/26(日) 03:12:42.89
Haskellって組み込みにも適した言語だよね?
ハードリアルタイムシステムとかにもぴったりっぽい
541デフォルトの名無しさん:2012/08/26(日) 03:20:21.13
>>540
Haskellが組み込みに特に適している一番の理由は「C言語を自動生成しやすいから」
542デフォルトの名無しさん:2012/08/26(日) 08:55:55.63
やたらと場合分けしなくて済むようになるライブラリ教えて

僕はもう迷いたくないんだ
543デフォルトの名無しさん:2012/08/26(日) 08:57:23.97
どういう場合分けを消したいのか例を書いてくれんと分からん
544デフォルトの名無しさん:2012/08/26(日) 10:16:31.17
haskellでopenglっていける?
545デフォルトの名無しさん:2012/08/26(日) 10:18:13.93
問題なくいける。

それでゲーム作ってるし。
546デフォルトの名無しさん:2012/08/26(日) 10:21:17.36
どうせopenglRaw触る事になる
547デフォルトの名無しさん:2012/08/26(日) 16:32:50.87
hackage.haskell.orgって定期的に落ちるよな
メンテナンス?
548デフォルトの名無しさん:2012/08/26(日) 18:26:39.54
hackage.haskell.biz
549デフォルトの名無しさん:2012/08/26(日) 20:35:41.27
>>545
OpenGL使えるのは知ってるんだけど、
ゲームだと入力(ゲームパッドとか)と音もHaskellでいけるの?
550デフォルトの名無しさん:2012/08/26(日) 20:50:13.63
>>549
いける
551デフォルトの名無しさん:2012/08/26(日) 22:35:37.20
>>549
最悪の場合はCを呼び出せばいい
552デフォルトの名無しさん:2012/08/26(日) 22:51:48.43
>>550,551
なるほど、今度調べてみる
553デフォルトの名無しさん:2012/08/27(月) 05:13:38.08
どうせIOモナド使ってCと同じようなコードになる
554デフォルトの名無しさん:2012/08/27(月) 06:39:23.08
差別化しなくて済む
もう迷わない
555デフォルトの名無しさん:2012/08/27(月) 07:17:17.35
>>553
IOモナドは当然使うことになるが、レンダリングパイプラインの深いところは
ちゃんと隠すようにプログラムするから、Cよりもう少し抽象的になる。

たとえば、GPipe なんか使ってみてはどうだ?
なかなかよくできたライブラリだぞ。

ただ、ゲームではなかなか使いにくいから、
俺は GPipe を参考に自分用のライブラリを作ったが。
556デフォルトの名無しさん:2012/08/27(月) 10:40:24.89
自作ライブラリみせてー
557デフォルトの名無しさん:2012/08/27(月) 12:33:47.71
>>556
どうして?
公開しないつもりで自分だけのために作ったライブラリを見せる理由が思いつかない。
558デフォルトの名無しさん:2012/08/27(月) 12:42:13.38
深い意味ないだろ。
なんかこんなん作ったよいうから、どんなん?って言ってるだけで。
なんか自意識過剰なんじゃねーの。わざわざココで俺スゴイ?俺スゴイ?とか書いてるくせに。
559デフォルトの名無しさん:2012/08/27(月) 13:07:56.04
>>555の内容
・Haskell使えばCより抽象度は上がる
・GPipeがいいらしいがゲームでは使いにくいかもしれない
・俺SUGEE
560デフォルトの名無しさん:2012/08/27(月) 13:39:21.03
嬢「えーすごーい!見せて見せてー」
客「見せる理由が見つからない」
嬢「...」
561デフォルトの名無しさん:2012/08/27(月) 17:57:08.36
プログラムを作ったことは自慢したいが、ソースは渡したくない
562デフォルトの名無しさん:2012/08/27(月) 18:00:32.51
カレーを作って友達を呼んだがご飯は炊けてない
563デフォルトの名無しさん:2012/08/27(月) 18:17:29.33
最近はyoutubeで動くところをUPして自慢しようとしたが、画面キャプチャで文字が潰れてよく見えない
564デフォルトの名無しさん:2012/08/27(月) 18:20:48.13
YouTubeに働くところをUPしよう
565デフォルトの名無しさん:2012/08/27(月) 18:28:10.11
俺もいいもの作ったけど、お前らに見せる理由が思いつかなくて困ってる
566デフォルトの名無しさん:2012/08/27(月) 19:24:45.63
>>561
要は自信がないんだな
567デフォルトの名無しさん:2012/08/27(月) 19:47:52.95
凄ぇ粘着
568デフォルトの名無しさん:2012/08/27(月) 20:18:45.75
羞恥駆動プログラミング
569デフォルトの名無しさん:2012/08/27(月) 22:28:43.79
GPipe が今のままではゲームにあまり向かないと私が思う理由は、
細かいところまで挙げれば色々あるが、大きなところでは2つ。

ただ、これらは作るゲームの規模や求めるクォリティに依ると言われれば、
確かにそれは否定できないことを先に断っておく。

・UIのインフラがGLUT固定であること
GLUTがゲームに向いていないと言うよりも、もっとゲームに向いたライブラリがあるのに
それを基盤として使えないのが問題。

他の FRP ライブラリとも相性悪すぎる。

また、ウィンドウ生成の仕組みがラップされているから、マルチウィンドウができない。
よって、デバッグ情報などはゲームと同じウィンドウに出すことになる。


・テクスチャに直接レンダリングできない

どうも、レンダリングターゲットとして用意されたバッファは
レンダリングされたフレームバッファの内容をテクスチャへ「コピー」はできる。
570569:2012/08/27(月) 22:31:39.36
すまんすまん、途中で書き込んでしました。
あと、言い忘れたが私は >>555 だ。


・テクスチャに直接レンダリングできない

どうも、レンダリングターゲットとして用意されたバッファは1枚しかないようだ。
そのバッファの内容をテクスチャへ「コピー」して使うことはできる。
571デフォルトの名無しさん:2012/08/27(月) 23:18:41.47
抽象的ライブラリは、自分以外の部品を自分より下の層に位置付けようとするから
二つ以上組み合わせると相性が悪いのだ

抽象と具象のような上下関係がないライブラリがあれば
どちらが上か喧嘩することもないと思うのだが
572デフォルトの名無しさん:2012/08/28(火) 00:31:31.69
そんな問題が起きないようにtype classがあるのに。
573デフォルトの名無しさん:2012/08/28(火) 02:40:42.40
>>561
臆病な自尊心と尊大な羞恥心
574 ◆QZaw55cn4c :2012/08/28(火) 05:26:41.45
>>573
山月記ですか
575デフォルトの名無しさん:2012/08/28(火) 05:26:47.13
>>561
その声は、我が友、李徴子ではないか?
576デフォルトの名無しさん:2012/08/28(火) 22:55:18.27
山月記と悟浄出世が好き
577デフォルトの名無しさん:2012/08/29(水) 13:28:14.97
悟浄出世悲しすぎる (;ω;)
まるでモナドの真意が分からなくてさまよい続ける俺を見ているようだ

ああ、そうかモナドって漢字で「喪等」って書くんだろ
モテで頭の良い人間が俺のような妖怪を閉じ込めておくために作った知的迷宮なんだろ
578デフォルトの名無しさん:2012/08/29(水) 14:40:30.24
はいはい、楔形文字と粘土板、粘土板
579デフォルトの名無しさん:2012/08/29(水) 16:28:47.11
も等の真意ってのは、なんでこう言う定義にすると有用なんだろうか?ってことかい
580 ◆QZaw55cn4c :2012/08/29(水) 19:33:36.45
>>577
これよりのちは一切の思念を棄てただただモナドを働かすことによってみずからを救おうと心がけるがよい。
モナドとは人の作用の謂じゃ。モナドは概観によるときは無意味のごとくなれども、その細部に直接働きかけるときはじめて無限の意味を有つのじゃ。

敦ちゃん人気だねえ。
581デフォルトの名無しさん:2012/08/29(水) 21:07:58.07
モテナイ奴を称して「喪無奴」と畏ふ
582デフォルトの名無しさん:2012/08/29(水) 21:39:25.80
Haskellの入門者や中級者が集う掲示板サイトどこかお勧めない?もちろん英語でもおk。
ここはダメだわw
583デフォルトの名無しさん:2012/08/29(水) 23:24:29.37
Stack Overflow
584デフォルトの名無しさん:2012/08/30(木) 00:57:19.87
>>582
メーリングリストに登録すればいいと思う
585デフォルトの名無しさん:2012/08/30(木) 03:31:02.20
モナドは発動の順序を保証する

f . g
も発動の順序を保証しますよね?

モナドは造られたものじゃない
見つけられたものなんでしょう

これはC++がテンプレートの機構をハックしてTMPを見つけた事に似てる気がします
586デフォルトの名無しさん:2012/08/30(木) 07:19:19.15
>>585
f . g も評価の順序は f より g が先だと保証されている。
(発動とか訳分からん用語使うな)

にも関わらずわざわざ (>>=) などが改めて定義されているのは、
Haskell でモナドを構成するのに評価順序以外にも必要な要素があるからだ。

> モナドは造られたものじゃない
> 見つけられたものなんでしょう

「A History of Haskell」に何から発想を得たのか少しだけ書かれている(7章2節)。
解説が面倒だから、興味があれば自分で読んでくれ。
587586:2012/08/30(木) 07:25:22.85
>>585
すまん、「評価」という操作が何か、どこまでを指しているかに依っては、
>>586 の説明は間違っているかもしれんな。

より正確に言えば、 (f . g) x も x に適用する関数は
f より g が先だと保証されている。
588デフォルトの名無しさん:2012/08/30(木) 10:19:40.49
>>585
IOモナドは「発動しない」ことを保証しますよ
つまり IO a の値から a の値がただちに発生することはない
589デフォルトの名無しさん:2012/08/30(木) 11:02:46.36
発動とかお前らが語ってるものはイデか何かか
Monoide
590デフォルトの名無しさん:2012/08/30(木) 21:06:58.47
コードをあまりいじらずに評価順序を制御する方法をご存知ないですか?
例えばリストを集合と見立てて冪集合を作る関数powersetを以下の用に定義します
powerset :: [a] -> [[a]]
powerset [] = [[]]
powerset (x:xs) = one ++ other
where one = [(x:ys)|ys<-other]
other = powerset xs
これを用いて与えられた集合からn個取り出した組み合わせの集合のリストを作る関数
combinationsを定義すると、
combinations :: Int -> [a] -> [[a]]
combinations n xs = filter ((n==).length) $ powerset xs -- 1)
のように定義出来ます。しかしこれではpowersetがn個以上の要素を含むリストを生成してしまうように思えます。
それをさせない為には、
combinations 0 _ = [[]]
combinations _ [] = []
combinations n (x:xs) = one ++ other
where one = [(x:ys)|ys<-(combinations(n-1)xs)]
other = combinations n xs -- 2)
のように定義する必要があります。ここで1)のコードの評価順序をうまいこと制御できれば、
((n==).length)が集合の要素がn個を越えた時点でその集合を弾いてくれるようになり、
2)のように定義しなくても良くなると思うのです。
591デフォルトの名無しさん:2012/08/30(木) 22:08:21.96
集合って馬鹿正直に全ての範囲をチェックするから信頼できるのであって
うまいこと範囲を狭めようとするのは本末転倒な気がする

話は逸れるがTMTOWTDIってのも馬鹿正直に全ての方法を吟味する事に意味があると思った
592デフォルトの名無しさん:2012/08/30(木) 23:49:28.03
>>590
powersetの結果の一部だけ評価したいんだろうけど、
それだと[[a]]を返すのはあんまり適してない

リストを部分的に探索するには、
「先頭から適当なところまで読んで以降を捨てる」
という方法しかない
もっと賢い打ち切りをしたければもっと複雑な木構造を使う必要がある
この例ならTrieみたいな奴でok

http://ideone.com/GYpdW
593デフォルトの名無しさん:2012/08/31(金) 11:18:29.77
ファイルからデータを読み込み解析するとします
全てを一気に処理するわけでなく、必要に応じて部分的に遅延評価します

結局処理されず仕舞いの部分がありえます
各々の部分はいつ評価されるか判らないのです


こういった事例では
遅延読み込みは危険だと認識しております
一度正格読み込みをし、配列等にプールしておき、そこから遅延評価すべきですか?
594デフォルトの名無しさん:2012/08/31(金) 11:43:02.92
書き換えされることに対する懸念?であれば一度コピーしたファイルを使ったら?処理されずじまいのものは処理されないんだからいいんじゃないの?
595デフォルトの名無しさん:2012/08/31(金) 11:54:18.83
Windowsってファイルをロック出来ないんだっけ?
596デフォルトの名無しさん:2012/08/31(金) 12:08:48.66
できるよん
597593:2012/08/31(金) 12:37:16.37
いつ読まれるか判らないのです
つまりずっとファイル開いとかないといけませんよね
これって良くないと思うのですが
598デフォルトの名無しさん:2012/08/31(金) 12:37:49.07
>>593
そういった事例で遅延読み込みがなぜ危険なのか、あなたの認識を教えてほしい。
599593:2012/08/31(金) 13:20:00.92
ごめんなさい
実はどういう時に遅延読み込みが危険かよく理解してないのです(´・ω・`)
600デフォルトの名無しさん:2012/08/31(金) 13:33:10.62
>>597
ファイルを開きっぱなしが嫌なら、
ファイルのポインターなどを持っていて遅延で実際にある部分を読むときだけ開いたら?
601593:2012/08/31(金) 15:18:58.60
はい(´・ω・`)
602デフォルトの名無しさん:2012/08/31(金) 16:26:01.85
遅延読み込みって必要になったら読み込むって事だよね
普通の手続き型でも大抵の場合必要になったら読み込んでるわけで
むしろ正格読み込みで初めに一気に読み込む方が珍しいんじゃなかろうか
603593:2012/08/31(金) 20:25:42.49
(´・ω・`)はい
604デフォルトの名無しさん:2012/09/01(土) 10:13:06.28
ファイル読み込みって当然容量にも寄るけど
ディスクアクセスの時間はバカにならんので
実は最初に全部読んでメモリに置いた方が
一部しか使わなくても速いことだってあるぞ
605デフォルトの名無しさん:2012/09/01(土) 10:56:45.84
手続き型でも普通に遅延評価できる
関数型との違いは副作用があるかどうかという点だけ
例えば手続き型で read_line () とかが呼び出されるまではファイルを読まないが
呼び出すと毎回違う値が返ってくる
606デフォルトの名無しさん:2012/09/01(土) 10:57:39.87
実は最初に全部読んでメモリに置いた方が
一部しか使わなくても速いことだってあるぞ
607デフォルトの名無しさん:2012/09/01(土) 11:16:08.88
素直にConduit使ってればいい
全部読むにしてもpipe一つ引っ付けるだけでいいし
608デフォルトの名無しさん:2012/09/01(土) 11:23:38.89
>>606
確かに速いこともあるがもし入力が無限だったら無限に遅くなる
無限のリストを許しているのだから無限の入出力を禁止するわけにもいかない
609デフォルトの名無しさん:2012/09/01(土) 11:37:58.05
この言語、コンストラクタ名被り易くない?衝突回避法教えて?
610デフォルトの名無しさん:2012/09/01(土) 11:40:15.18
>>609
異なる名前を付ける
611デフォルトの名無しさん:2012/09/01(土) 11:41:22.72
>>609
型名を接頭語につける
612デフォルトの名無しさん:2012/09/01(土) 11:41:50.29
モジュール分ける
full importしない
613デフォルトの名無しさん:2012/09/01(土) 11:43:47.21
import Baka as B
614デフォルトの名無しさん:2012/09/01(土) 11:44:36.49
コンストラクタ公開って内部構造を見せてるわけだから
あんまりよくないよね
615デフォルトの名無しさん:2012/09/01(土) 11:52:06.87
データコンストラクタを生で公開してるならむしろ衝突は稀じゃね?
>>609が言ってるのはemptyとかsingletonのたぐいだと思うけど
616デフォルトの名無しさん:2012/09/01(土) 12:00:33.35
import qualified Data.Set as Set
import Data.Set (Set)

って二行目がいるのが面倒
モジュール名としての文脈ならばモジュール名のSet
型としての文脈なら型としてのSetと解釈して欲しい
そこまでいかなくともAgdaのモジュールシステムぐらい柔軟にやってほしい
617デフォルトの名無しさん:2012/09/01(土) 12:00:48.54
>>614
内部の値を自由にいじらせても型さえ合っていれば問題ないという建前なのでは?
型が合ってたら安全っていうのを論破できる奴は少数派だろ
618デフォルトの名無しさん:2012/09/01(土) 12:52:18.15
なんか遅延評価の話が無茶苦茶だなw
さすが2chだわ
619デフォルトの名無しさん:2012/09/01(土) 13:21:23.98
手続きの呼び出しと式の評価は似ているから難しいよな
ポインタと配列が似ているような感じ
620デフォルトの名無しさん:2012/09/01(土) 13:23:48.79
>>618
先生、お待ちしておりました

ナイーブな理解の我々にどうか光を照らして下さい
621デフォルトの名無しさん:2012/09/01(土) 20:30:12.90
すごいエッチな本買った
622デフォルトの名無しさん:2012/09/01(土) 20:30:51.82
gru, enlighten me.
623デフォルトの名無しさん:2012/09/01(土) 21:24:07.13
>>617
「安全」と「問題ない」では全然違う
例えば内部状態公開しちゃうと、後から変えるのが難しくなる
624デフォルトの名無しさん:2012/09/01(土) 22:09:23.37
>>623
破壊的な変更が難しくなるのは良いことじゃないか
例えば型クラスを使うならインスタンスを後で変えるのではなく
新たに別のインスタンスを定義するべきだ
625デフォルトの名無しさん:2012/09/01(土) 22:14:08.35
データ構成子を公開しないことの目的は安全性のためではなくモジュラリティの向上
内部表現を閉じ込めるため
内部表現を変更したとしても、その型を利用するコードは変更せずにすむ
内部表現に依存したコードは、内部表現を変更したら、同時に変更する必要がある
626デフォルトの名無しさん:2012/09/01(土) 22:31:32.67
内部をいじらせても問題ないって……。プログラム書いたことあるの?ってレベルだぞ
627デフォルトの名無しさん:2012/09/01(土) 22:36:30.81
理論的なものはしらんが名前付き引数コンストラクタは、それが無い言語に比べたらゲロ吐くぐらい便利というのは経験した
628デフォルトの名無しさん:2012/09/01(土) 22:39:55.67
Data.Dynamic便利だねぇ・・・

・・・Typeableがderive以外許されなくなるのはいつですか?
629デフォルトの名無しさん:2012/09/01(土) 23:32:19.37
>>626
プログラムは書かないけど型だけ考えるってレベルが役に立つ可能性はもうないのかね
630デフォルトの名無しさん:2012/09/01(土) 23:38:49.17
そんなに型が好きなら依存型でも触ってればいい
631デフォルトの名無しさん:2012/09/02(日) 02:48:45.96
型というよりソフトウェア工学で経験的に知られている事じゃないの
オブジェクト指向プログラミングでいう開放・閉鎖原則
「モジュールは修正に対して閉じていなければならない」

関数型プログラミングで何て言うのかは知らんけど、
たぶん普遍性があるはず
632デフォルトの名無しさん:2012/09/02(日) 06:49:07.82
モジュールの追加・削除・修正の3種類が必要だと言うかも知れないし
追加と削除だけでいいと言うかも知れないし
追加だけでいいと言うかも知れない
この状況で普遍性があるってのは全く意味がわからない
633デフォルトの名無しさん:2012/09/02(日) 08:10:36.18
Haskllerらしい非常に良い議論ですね
634デフォルトの名無しさん:2012/09/02(日) 11:41:20.33
公理的意味論を使って無理やり一般化すると
修正に対して閉じた⊆より弱い事前条件
拡張に対して開く⊆より強い事後条件
635デフォルトの名無しさん:2012/09/02(日) 12:17:16.98
ttp://blog.tmorris.net/20-intermediate-haskell-exercises/

class Fluffy f where
furry :: (a -> b) -> f a -> f b

instance Fluffy ((->) t) where
furry = error "todo"

(->) t って何者なの?
636デフォルトの名無しさん:2012/09/02(日) 14:54:51.61
(->) a b

a -> b
637デフォルトの名無しさん:2012/09/02(日) 17:08:02.05
a `->` b
638デフォルトの名無しさん:2012/09/02(日) 17:09:19.37
<* `-` *>
639デフォルトの名無しさん:2012/09/02(日) 17:14:46.80
/ /(<i>)\ \
640デフォルトの名無しさん:2012/09/02(日) 17:42:54.79
parsec

parseTest (many (oneOf "abcdef,") `sepBy` char ',') "abc,def"

["abc,def"]



区切り文字は使っちゃ駄目なのね

第一項のパーサから一々区切り文字を除外しなきゃいけないのは冗長な気がする
641デフォルトの名無しさん:2012/09/02(日) 18:40:46.87
その文法が曖昧だから最長一致してるだけ
sepByで区切られる個々のフィールドに区切り文字が出現すること自体は普通にある

> parseTest ((char '(' *> many (oneOf "abcdefgh,") <* char ')') `sepBy` char ',') "(abc,def),(gh)"
["abc,def","gh"]
642デフォルトの名無しさん:2012/09/02(日) 19:02:55.36
>>641
(*>)と(<*)しゅごい!

between を窓から投げ捨てた!
643デフォルトの名無しさん:2012/09/02(日) 23:25:56.71
リファレンス読んでてこんなの何に使うんだよって思ってたのが
実例見てアハ体験するの気持ちいい

ンギモッヂィイイイイッッ!!!!
644デフォルトの名無しさん:2012/09/03(月) 03:12:44.40

 気 持 ち 悪 い 

645デフォルトの名無しさん:2012/09/03(月) 22:32:28.56
ん?ByteStringじゃ日本語文字扱えないの?
646デフォルトの名無しさん:2012/09/03(月) 22:38:29.59
日本語文字じゃなくてエンコード名で言ってくれ。
あと、扱うというのがどういう事を指してるのか曖昧。

そして、恐らく「Haskell ByteString 日本語」でググって考えれば、
求めている答えに相当近づくはずだ。
647デフォルトの名無しさん:2012/09/03(月) 22:55:08.98
cp932扱うならtext-icu使うしかないんだよね・・・
648デフォルトの名無しさん:2012/09/03(月) 22:59:21.14
文字コードの違いを型で表現するのは技術的に難しいのかねぇ
649デフォルトの名無しさん:2012/09/03(月) 23:40:42.77
foldMap :: (Monoid m, Foldable t) => (a -> m) -> ta ->m
第2引数が第1引数の入力になるという理解で正しい?
意味的にはf(ta) -> mなの?
650デフォルトの名無しさん:2012/09/04(火) 07:15:37.26
そういう疑問が出てきた時は
まず初めにライブラリ ドキュメントにあるソースを読むこと。

もしローカル環境にインストールしたドキュメントにソースへのリンクがなくても、
Hackage のサイトにはたいていのライブラリでソースも載ってるから。

Data.Foldable.hs にある Foldable クラスの定義を見てみると、
次のようにデフォルトの実装が書かれている。

class Foldable t where
    foldMap :: Monoid m => (a -> m) -> t a -> m
    foldMap f = foldr (mappend . f) mempty


> 意味的にはf(ta) -> mなの?

すまん、意味的にはの意味がよく分からん。
意味的も何も、この定義が全てを語ってると思うが・・・
651デフォルトの名無しさん:2012/09/04(火) 09:16:21.47
>>649
↓ここの冒頭にあるインスタンス定義例を見ると分かるよ。
ttp://www.haskell.org/ghc/docs/latest/html/libraries/base/Data-Foldable.html

だから「意味的にはf(ta) -> mなの?」は違う。fに求められてる定義からして合わないけどね。
652デフォルトの名無しさん:2012/09/05(水) 15:31:34.11
UTF-8 エンコーディングのソースファイルに文字列リテラル "あいうえお" を記入したら
ghcはこれを読んでHaskell 内部文字列データに変換するのですか?
653デフォルトの名無しさん:2012/09/05(水) 22:33:29.81
はい
654デフォルトの名無しさん:2012/09/05(水) 22:37:46.26
はい、じゃないが
655デフォルトの名無しさん:2012/09/05(水) 22:48:08.88
いいえ
656デフォルトの名無しさん:2012/09/05(水) 22:51:14.87
f :: (a -> b) -> (r -> a) -> (r -> b)

この型の評価順序がわかりません
657デフォルトの名無しさん:2012/09/05(水) 23:17:24.70
どの型の評価順序ならわかるんだ?
658デフォルトの名無しさん:2012/09/05(水) 23:36:45.54
>>654
もうだめだー!
659デフォルトの名無しさん:2012/09/05(水) 23:47:51.56
>>656 遅延評価の勉強やりなおし
660デフォルトの名無しさん:2012/09/06(木) 07:06:57.80
>>656
そもそも、型に評価順序なんてありません。
評価順は関数の定義によります。
(だから >>657 は完全に嫌みでしょうね)

その型の関数を使って例えば print (f a b) を評価した場合に、
関数の定義によっては a b の順に評価されるかも知れないし、
b a の順に評価されるかも知れないし、a は評価されないかも知れない。
様々なことが考えられます。
661デフォルトの名無しさん:2012/09/06(木) 09:37:20.60
メタプログラミングの段になったら型の評価順序も問題になりだすんちゃうん?
662デフォルトの名無しさん:2012/09/06(木) 10:57:28.34
英語の質問です

If p fails and consumes some input, so does lookAhead.


この so does は fails のみに掛かってるのですか?
それとも fails と consumes の両方に掛かってるのですか?
663デフォルトの名無しさん:2012/09/06(木) 11:28:55.19
consumeだけかもしれんよ

プログラムの動作で判断して
664デフォルトの名無しさん:2012/09/06(木) 11:59:32.63
もっと前の方から読めば分かるんじゃないかと思うけど
結局コードを読むか自分で書くかしないと分からない英文ってのもあるから
665デフォルトの名無しさん:2012/09/06(木) 12:19:02.34
そうですか(´・ω・`)
666デフォルトの名無しさん:2012/09/06(木) 12:37:50.09
andなら普通は両方を含むんじゃないかな
667デフォルトの名無しさん:2012/09/06(木) 14:10:26.76
なんかparsecのドキュメントで見たような文章だ
668デフォルトの名無しさん:2012/09/06(木) 15:28:46.82
>>667
イグザグトリィッ!
669デフォルトの名無しさん:2012/09/06(木) 22:14:03.20
今見つけたんだけど、なんか面白そう:

48時間でSchemeを書こう
ttp://ja.wikibooks.org/wiki/48%E6%99%82%E9%96%93%E3%81%A7Scheme%E3%82%92%E6%9B%B8%E3%81%93%E3%81%86
670デフォルトの名無しさん:2012/09/06(木) 22:23:53.09
Scheme書いたら次はそのSchemeでPrologを書く
671デフォルトの名無しさん:2012/09/06(木) 23:03:30.83
そんなのあったのか、ちょうどここ数日HaskellでパーサーとSchemeを書いていたところだ…
IORefを使ったら処理が悉くIOアクションになってしまってなんか悲しい
せっかくだから、一般化set!とか、call/ccとか、その他諸々をきっちり実装したいな
672デフォルトの名無しさん:2012/09/06(木) 23:24:27.88
むしろ、set!系 を完全排除して、全部遅延評価にしたschemeにしてはどうだろうか
673デフォルトの名無しさん:2012/09/07(金) 00:06:31.49
>>669
「モナドとは簡単な概念に難しい名前がついているだけです。」

www
674デフォルトの名無しさん:2012/09/07(金) 00:09:02.92
⊥ってなんですか?むせちゃうんですか?
675デフォルトの名無しさん:2012/09/07(金) 02:23:07.74
よく分からないんだけど、HaskellでSchemeコンパイラ作るのと、HaskellでHaskellコンパイラ作るのと、どっちが難しいの?
676デフォルトの名無しさん:2012/09/07(金) 02:30:32.23
>>675
schemeって文法セットがすごく小さいんじゃなかったっけ。wikiとかに載ってるんじゃないかな
677デフォルトの名無しさん:2012/09/07(金) 02:53:08.03
たぶんSchemeのほうが楽だけど、
フルセットのSchemeは楽と呼べるほど簡単でもないと思う
678デフォルトの名無しさん:2012/09/07(金) 07:43:15.88
間違いなくSchemeのがラク
679デフォルトの名無しさん:2012/09/07(金) 07:47:51.37
そりゃ文法だけならS式は楽すぎるだろう
680デフォルトの名無しさん:2012/09/07(金) 14:12:59.23
名前がぶつかったら今書いてるモジュールの方のだって指示したいとき
自分のモジュール名で修飾すればいいですが冗長な気がします

This.みたいな修飾ができないものでしょうか
681デフォルトの名無しさん:2012/09/07(金) 15:29:16.00
略称の指定では不満なのかい?一文字でもいけるからthisより短い
682デフォルトの名無しさん:2012/09/07(金) 18:53:43.09
あ、そうか
683デフォルトの名無しさん:2012/09/07(金) 19:08:55.03
自分のモジュールの略称ってどう宣言するんすか?
684デフォルトの名無しさん:2012/09/07(金) 19:32:57.95
モジュール名は省略しない方が保守しやすいと思う
685デフォルトの名無しさん:2012/09/07(金) 19:56:21.80
(´・ω・`)はあ
686デフォルトの名無しさん:2012/09/08(土) 02:24:00.86
>>683
インポートするときに自分で省略形を决める

なんだかんだ言って省略しない方が良かったりするのは同意
687デフォルトの名無しさん:2012/09/08(土) 02:28:22.39
自分のモジュールで自分をインポートできないでしょ?
688デフォルトの名無しさん:2012/09/08(土) 03:15:43.87
インポ
689デフォルトの名無しさん:2012/09/08(土) 04:02:35.60
>>687
自分のモジュールインポートするときに名前指定できなかったっけ?
SOURCE と boot で
690デフォルトの名無しさん:2012/09/08(土) 12:34:51.91
Module Test where
import {-# SOURCE #-} Test As T
691デフォルトの名無しさん:2012/09/08(土) 14:59:56.68
あざっす^^
692デフォルトの名無しさん:2012/09/08(土) 15:26:05.94
>>669
おおこれは面白そうだ
でもS式パーサ位ジェネレータ使わずに書きたい
693デフォルトの名無しさん:2012/09/08(土) 16:07:29.54
>>669
内容はいいんだけど、次のページに進むリンク設けて欲しい。作り忘れかな
694デフォルトの名無しさん:2012/09/08(土) 17:06:48.03
やっぱSOURCEプラグマは.hs-bootの用意とか面倒臭いから辞めて冗長に修飾するわ
695デフォルトの名無しさん:2012/09/08(土) 18:05:20.06
別ファイルの内容をインクルードするにはどうしたら良いですか?
696デフォルトの名無しさん:2012/09/08(土) 18:44:15.82
>>695
今のGHCではできません。
697デフォルトの名無しさん:2012/09/08(土) 20:04:45.61
>>696
え、おれ695じゃないけど、これマジ?
.hs ファイルが長くなってきてどうしようか悩んでたんだけど、、
698デフォルトの名無しさん:2012/09/08(土) 20:13:01.03
GHC 7.6.1 やっと来たぜ
699デフォルトの名無しさん:2012/09/08(土) 20:18:27.50
>>697
ファイルをインクルードできないのなら、モジュールをインポートすればよいのではなくって?
あと、Haskellの仕様ではないが、ghcからCプリプロセッサを呼べば、ファイルのインクルードもできると思う
700デフォルトの名無しさん:2012/09/08(土) 23:08:50.89
プログラムを生成するプログラムを書けば全て解決だぜ
701デフォルトの名無しさん:2012/09/08(土) 23:09:58.88
夜中に勝手にプログラムを作ってくれる小人さんがほしいんですが
702デフォルトの名無しさん:2012/09/08(土) 23:42:29.66
Haskellで夜中に勝手にプログラムを作ってくれる小人さんがほしい状況って、
ちょっと想像できない。

Haskellでプログラムするの辛いの?
703デフォルトの名無しさん:2012/09/09(日) 02:43:53.94
そ、そんなことないよ^^;
704デフォルトの名無しさん:2012/09/09(日) 03:05:10.41
でもsybって小人さん召喚の呪文じゃないんですか?
705デフォルトの名無しさん:2012/09/09(日) 07:59:37.65
7.6.1でcatchがpreludeから消えたから修正しといて
706デフォルトの名無しさん:2012/09/09(日) 15:00:24.27
>>698
Lambda-caseは便利そう
707デフォルトの名無しさん:2012/09/10(月) 23:11:10.73
(a -> b)は、普通の関数
f (a -> b)は、文脈中の関数

ここでの文脈の厳密な定義ってなんなの?
708デフォルトの名無しさん:2012/09/10(月) 23:41:12.68
(Applicative)FunctorとかKleisli Triplesとか
709デフォルトの名無しさん:2012/09/11(火) 00:05:06.95
数字や文字列、関数が持つ意味。
710デフォルトの名無しさん:2012/09/11(火) 10:46:08.58
ghc 7.4.1を使って標準入力の行数をカウントしてくれるプログラムを作りました。こんなのです。
main = getContents >>= (return . length . lines) >>= (putStrLn . show)
自分は、これは各行が短い場合はlengthがすぐlinesのリストの要素を捨ててくれるので何とかなるが、
数GBとかの長大な行の入力が合った場合、その分、つまり一行分のメモリを食ってしまうのではないかと思いました。
というのも、linesとlengthが別個にコンパイルされてオブジェクトコードになっているなら、
lengthがリストの要素を捨てられるのはlinesが一つの要素を確定してからになるのではないかと思ったからです。
しかし、そんなことはないようです。ghcはどんな仕組みでメモリ消費量を抑えているのでしょうか。
711デフォルトの名無しさん:2012/09/11(火) 19:38:06.70
>>710
> linesとlengthが別個にコンパイルされてオブジェクトコードになっているなら

ここで言うオブジェクトコードというのが、
gcc がリンクするためのオブジェクトコードという意味なら、それはないと思う。
ライブラリが個々にオブジェクトコードになってたら、インラインできん。

で、本題だが

lines 関数のソースを見ると、__GLASGOW_HASKELL__ の場合、
String型のリストを作るのに遅延パターンを使っている。
これがメモリ消費量が抑えられている肝になるのではないかと思う。

試しに、遅延パターンを使わない方の lines 関数を自作してやってみてくれないか。
これでメモリ消費が明らかに増えれば、遅延パターンの恩恵だと言えそうだ。

ハズレかも知れんがな。
712711:2012/09/11(火) 19:58:31.22
すまん、全く関係なかった・・・
713711:2012/09/11(火) 20:29:00.92
すまんすまん、理由が分かった、と思う。

length 関数は引数が [] にマッチするか (_:xs) にマッチするかだけを見ている。

その引数である lines 関数は、その内部で
文字列を \n の前と後で分けるために break 関数を使っている。

その break 関数の型は、次の定義になっている。

break :: (a -> Bool) -> [a] -> ([a],[a])
break _ xs@[] = (xs, xs)
break p xs@(x:xs')
    | p x = ([],xs)
    | otherwise = let (ys,zs) = break p xs' in (x:ys,zs)

ここで、break 関数の戻り値てであるタプルの第1要素の「内容」が必要であれば、
in (x:ys,zs) の部分の x:ys によって、メモリがどんどん使われる。

しかし、今回は内容は一切使われていない。

と言うのも、lines 関数の中では break 関数の戻り値であるタプル (x:y) を
x:y というリストに変換して返している。
このリストは length 関数の引数に渡されるが、
リストという形になっているかどうかしか見ていないため、
break 関数の x:ys が使われていない。

よって、文字列の全てをスキャンすることはするが、
スキャンした結果の文字列はメモリに保存されてはいないため、
結果してメモリ消費量が抑えられたと思われる。

文字で説明するのは難しいな。
length、lines、break それぞれの関数をよく見れば、分かると思う。
714711:2012/09/11(火) 20:30:15.49
>>713
訂正

> その break 関数の型は、次の定義になっている。

その break 関数は次の定義になっている。
715デフォルトの名無しさん:2012/09/11(火) 20:31:58.14
take 10.unlines.lines$['a','a'..]
こうかな?
716711:2012/09/11(火) 20:35:16.89
>>713
あわわ ごめん
大きな間違いをもういとつ訂正。

> lines 関数の中では break 関数の戻り値であるタプル (x:y) を
> x:y というリストに変換して返している。

lines 関数の中では break 関数の戻り値であるタプル (x:y) を
x:(y の次の文字から再び lines) というリストに変換して返している。


あと、lines 関数のソースに __GLASGOW_HASKELL__ ではない定義もあるけど、
そちらでも同じ事。


・・・スレを汚してしまった
逝ってくる
717デフォルトの名無しさん:2012/09/11(火) 20:55:33.69
>>710
似たような話が ふつうのH に載ってた気がする
718デフォルトの名無しさん:2012/09/12(水) 00:07:43.22
http://en.wikibooks.org/wiki/Haskell/Category_theory
ここの内容の邦訳ってないのですか?
719デフォルトの名無しさん:2012/09/12(水) 00:30:09.97
>>718
目が悪いのか、それとも頭が悪いのか。両方か。
720デフォルトの名無しさん:2012/09/12(水) 00:46:18.77
Lispスレの基地外さんかw
721デフォルトの名無しさん:2012/09/12(水) 00:50:12.89
722デフォルトの名無しさん:2012/09/12(水) 00:52:10.29
日本人って>>719みたいな奴が多いな。相手を叩いて自分が浮上した優越感を得る小ささ。
そりゃ独創性なんか生まれるわけないわな。ちっさ。
723デフォルトの名無しさん:2012/09/12(水) 01:04:26.16
すごいブーメランだな、投げた瞬間自分に当たってる
724デフォルトの名無しさん:2012/09/12(水) 02:16:36.14
言うと思ったよ。おまい本当にしょぼい奴だな。言っててさびしくないの?
725デフォルトの名無しさん:2012/09/12(水) 02:29:14.65
さびしいかどうかに関わらず、バカを見付けたら誰よりも先に「バカ発見」と言わなければならない
726デフォルトの名無しさん:2012/09/12(水) 02:58:23.55
基地外はさっさと寝ろw
727デフォルトの名無しさん:2012/09/12(水) 07:08:44.61
>>719 のように言われてもう一度ページをしっかり見直す奴と、
>>722 のように思って何もしない奴とでは、今後の成長に差が出そう
728デフォルトの名無しさん:2012/09/12(水) 07:51:38.12
「言うと思った」って反論になってないよね
729デフォルトの名無しさん:2012/09/12(水) 07:53:24.62
というか719と723って別人なんだけどね。
何と戦ってるのか知らんが。
730デフォルトの名無しさん:2012/09/12(水) 08:04:52.79
> 日本人って>>719みたいな奴が多いな
本当に多いのかな?
どうやって多いことを示したのだろうか?
731デフォルトの名無しさん:2012/09/12(水) 08:07:03.97
優越感を得るための脳内統計だろう。ちっさ。
732デフォルトの名無しさん:2012/09/12(水) 08:26:09.55
問題は、プログラムの開発よりも人間の成長とかに興味を持っている奴が
なぜプログラム板にいるのかってことだ
733デフォルトの名無しさん:2012/09/12(水) 08:31:54.50
人間の成長に興味を持っていることとプログラムの開発に興味を持っていることって関係ないと思うんですが
どうして一方を立てれば他方が立たないと思ったのでしょうか?
734デフォルトの名無しさん:2012/09/12(水) 08:53:36.56
単一責任の原則のようなものか
735デフォルトの名無しさん:2012/09/12(水) 09:29:01.80
2ちゃんは人間観察用の箱庭だからな
736710:2012/09/12(水) 10:13:45.76
>>711-716
ありがとうございます。ちょっと自分ではまだ解明を進められていません。すいません。
確かに遅延評価を行っているなら最終的に各々の値が必要なのか分かっている状態になってから計算を始めるので、
ある値を計算する段階で必要ではない値は計算しない事で
(x:ys)のような不必要な値を残さない事が可能である事は理解できます。
ただ、それを実際どのように実現しているのか不思議に思いました。
というのも、haskellはコンパイラ言語であるので最終的に機械語の状態で解釈され計算を行うはずです。
ここでもしlengthやlinesが完全に機械語に変換されているならばlengthがlinesに実はその値は要らないんだ、
という事を知らせる事は不可能ではないかと思ったのからです。

今はいくつかの可能性を考えています。
一つはガーベージコレクタなどのメモリ管理モジュールに全てを任せてしまう方法です。
この場合(x:ys)は一応計算されメモリにストアされるものの、lengthが参照していないので、
GCが動作した時に全て破棄されてしまうという可能性です。
もう一つは一つのhaskell関数を幾つもの小さい関数としてオブジェクトファイル(.oファイル)に格納する方法です。
これにより、ある関数内部の必要な計算と不必要な計算を、小関数単位で呼び出す事で呼出側が制御する事が可能になり、
最終的にリンカのみで不必要な計算を排除出来る可能性があります。
まだよく分かって無いので、もうすこし調べてみようと思います。ありがとうございます。
737デフォルトの名無しさん:2012/09/12(水) 12:42:32.48
引力というのはお互い背を向けあってキャッチブーメランをすることらしいな
738デフォルトの名無しさん:2012/09/12(水) 12:50:31.15
>>736
> 確かに遅延評価を行っているなら最終的に各々の値が必要なのか分かっている状態になってから計算を始めるので、

違うよ。
遅延評価だけど、最終的に各々の値が必要なのかは、その時になってみないと分からないよ。

値が評価されたら、評価された値はメモリに残る。
しばらくメモリに残って、ガベージコレクタが動いたときにもう必要ないなら、
その時点でメモリから消される。

今回の (x:ys) は「評価されなかった」からメモリに残らなかった。
と考えてほぼ間違いない。


Haskell コードは GHC によってどのような C ソースにコンパイルされるかと言うと、
lengthやlinesなどがそのまま完全に機械語に変換されている訳ではない。
いわば中間コードのような形でプログラムがデータ化されている。

まず、その中間コードを「弱頭部正規形」という形に簡約する。
そうすると中間コードの頭の部分だけ明確になって評価可能状態になるから評価する。
で、その頭の部分を評価してるときに、中間コードの残りの部分が必要になる。
必要になったら、また残りの部分を「弱頭部正規形」に簡約し、頭を評価する。

当然、if や case of などので分岐するから、中間コードと言っても、
一列に数珠繋ぎのようになっているわけではない。
またグラフで管理してて、一度簡約した関数は再び簡約処理することは無いし、
本当はもう少し効率よくやってるが、イメージとしてはこんな感じ。

必要なら弱頭部正規形 --> 評価 --> 必要なら弱頭部正規形 --> 評価 --> ・・・
これを繰り返てプログラムを実行することで、遅延評価を実現している。
739デフォルトの名無しさん:2012/09/12(水) 13:47:36.22
まるでインタプリタのようですね
パフォーマンス的にどうなんでしょう
740デフォルトの名無しさん:2012/09/12(水) 14:43:21.89
>>739
まるまるインタープリタとも違うんだ。

中間コードのようなものとイメージして簡約処理を説明できるけど、
BASICとかC#のような中間コードではない。

あとグラフ簡約がパフォーマンスの要の一つになってる。
741デフォルトの名無しさん:2012/09/12(水) 15:00:53.46
>>739
ここのPDFを読むと良い

Implementing Functional Languages
http://research.microsoft.com/en-us/um/people/simonpj/papers/pj-lester-book/
742710:2012/09/12(水) 18:26:23.26
>>738
ありがとうございます。
(x:ys)はサンクが作られたが、
lengthが中身を見なかった、つまり評価されなかったので
メモリ消費量が増えなかったと言うことですね

遅延評価の実現方法は興味深いです
>>741の資料を読んでみます
ありがとうございました
743デフォルトの名無しさん:2012/09/12(水) 19:12:38.15
この際だから告白するけど、英語読めません
744デフォルトの名無しさん:2012/09/12(水) 19:25:43.73
ネットに繋がる環境がある以上、「読めません」は理由にならない
「訳す根性がありません」なら使ってもいいッ!
745デフォルトの名無しさん:2012/09/12(水) 19:46:43.16
>>744
ネットで訳すだけでよんだ気持ちになってるのか…
そりゃ、釈迦の言葉がただの呪文になっちゃうのもうなずける
746デフォルトの名無しさん:2012/09/12(水) 19:48:33.78
>>743
そんなこと言われても、申し訳ないが私の力ではもうどうすることもできん。

現時点で、実装方法に関してまとまった資料としては
>>741 が一番具体的でわかりやすいと思う。
他の資料は断片的なことしか書かれてなく、それもかなり抽象的だ。
まして、実装に関わる(まともに使える)日本語の資料なんてのは、
私が探した限りでは無かったよ。

あとは、これ以上探るのは諦めるか、日本語資料が出るのを待つか、
納得できなければ資料をなんとか読める程度まで英語力を上げるしかない。

ただ、>>710 の疑問を解消するのに実装方法を知る必要は無いよ。
遅延評価がまともに機能する実装なら、どんなものでも同じ結果だ。
747デフォルトの名無しさん:2012/09/12(水) 19:51:56.33
というか、ふつうのH の解説じゃダメなのか…
748デフォルトの名無しさん:2012/09/12(水) 19:55:40.93
>>745
すまん、何言ってんだか分からん
749デフォルトの名無しさん:2012/09/12(水) 20:01:41.12
>>747
それで >>710 の疑問が解消されそうなら、何ページのどこどこにあるとか言って、
もう少し詳しく勧めてやってくれ。
そうすれば立ち読みしたり図書館で読んだりできると思う。

面倒でになければ、その部分だけ要約して解説してあげると喜ぶだろう。

私は生憎とその本を持っていないので薦めることも解説もできん。
750デフォルトの名無しさん:2012/09/12(水) 20:39:54.75
>>740
.NETではHaskellの実装が非効率過ぎて無理だったという話を聞いたことがあるんだけれど、何かご存じないですか?
751デフォルトの名無しさん:2012/09/12(水) 21:29:59.89
>>750
しらん

が、予想してみると・・・

Haskell コードをバカ正直に中間コードに変換し、
それを .NET 上で動く「Haskell ランタイム」上で解釈するような事をしてたら、
そりゃ実際に動かしてみるまでもなく非効率すぎるだろうと誰もが分かってる。
(ランタイム on ランタイムなんて馬鹿げてる)

従って、そうではなく、GHC が Haskell コードを、
簡約すべき関数情報と簡約する手続きを直接実行する形の C 言語に変換してるように、
Haskell コードを同じような形の C# や MSIL のコードに変換したんじゃないかな。

でも、http://twtrland.com/profile/kazu_yamamoto
「飲み屋で二人の Simon に・・・」の件にあるように、
CLR はグラフ簡約マシンを作るには機能が足りないそうだ(古い情報だけどね)。

グラフ簡約を実現する部分はクラスを駆使しなければならなかったんだと思う。
グラフ簡約で使うグラフはサンクもポイントするし、そのサンクは GC にも関わる。
よって、Haskell らしさを表現する大部分をクラスを使って実現することになる。
これはもう、ほとんどランタイム on ランタイム状態と言っていいと思う。

グラフ簡約マシンを作るに足らない機能とやらが具体的になんなのか知らんが、
たぶん効率的なポインタ操作関連ではないかと、私は予想する。
752デフォルトの名無しさん:2012/09/13(木) 00:35:44.37
category-extrasをghciから利用するには、 :m+でいいの?
753デフォルトの名無しさん:2012/09/13(木) 16:05:16.54
パッケージ名じゃなく、中のモジュール名で :m+ しないと。
:m+ Control.Applicative.Parameterized
とか。
754デフォルトの名無しさん:2012/09/14(金) 02:55:34.75
Conduit と Enumerator ってどっちが優れてるの?
755デフォルトの名無しさん:2012/09/14(金) 11:10:52.19
Iteratorだった。。。
756デフォルトの名無しさん:2012/09/14(金) 11:54:43.13
クソッ hackage落ちすぎだろ
757デフォルトの名無しさん:2012/09/14(金) 17:36:14.70
僕は土管派
758デフォルトの名無しさん:2012/09/14(金) 22:19:48.86
Pointedってなくなってる?
759デフォルトの名無しさん:2012/09/14(金) 22:41:05.89
Lavaってどうなん?
760デフォルトの名無しさん:2012/09/14(金) 23:13:53.31
happyのglrってどうなったん?
761デフォルトの名無しさん:2012/09/15(土) 04:19:58.73
関数型言語の人は、豚肉を食わない何かの信徒みたいに副作用を忌避してますよね
何がそんなに怖いんですか。手続き型言語の人は、日本人みたいに平気な顔してるのに
762デフォルトの名無しさん:2012/09/15(土) 04:22:36.66
やっぱり手続き型言語、いわゆるドカタ言語を使ってる人って野蛮なんでしょうかね
763デフォルトの名無しさん:2012/09/15(土) 04:28:50.01
日本人はレストランで出るパセリを忌避しますよね
764デフォルトの名無しさん:2012/09/15(土) 09:26:56.29
>>761
マックス・ウェーバーの「プロテスタンティズムの倫理と資本主義の精神」でも読んで、
禁欲的なコミュニティが新しいものを作り出す仕組みを勉強してください。
765デフォルトの名無しさん:2012/09/15(土) 09:40:57.44
副作用を忌避する関数型のプログラミング倫理が
実はOOPの普及に大きく貢献したのだというITにおける逆説を究明した画期的な論考
(解説 まつもとゆきひろ)
766デフォルトの名無しさん:2012/09/15(土) 13:34:33.99
副作用はどんな害悪をもたらすんですか。やはり教義を破ったら地獄に落ちるんでしょうか
767デフォルトの名無しさん:2012/09/15(土) 13:41:52.90
数学でも強い公理を排除して行った証明では
証明の過程で使われている手法が
非常に強力なツールになることがある。
768デフォルトの名無しさん:2012/09/15(土) 13:52:18.95
答えになってない。それは理想論ですか
769デフォルトの名無しさん:2012/09/15(土) 13:55:43.93
いいところだから低能は黙って!
770デフォルトの名無しさん:2012/09/15(土) 14:13:55.33
単純な話で、副作用があるものと無いものを明確に分けること、
そして副作用が無い処理を基礎と置くこと、
このソースコードが理解しやすくなる。

もうひとつは、
771デフォルトの名無しさん:2012/09/15(土) 14:14:47.64
副作用は秘孔のようなものと某伝承者が
772770:2012/09/15(土) 14:17:06.60
Enter キーを押してしまった

単純な話で、副作用があるものと無いものを明確に分けること、
そして副作用が無い処理を基礎と置くこと、
この2点による恩恵が2つある。

ひとつはソースコードが理解しやすくなる事。
もうひとつは副作用が無い処理の部分で最適化を施しやすくなること。
(具体的には、フュージョンとか)

こんな事は関数型以外の言語でも当たり前に取り組んでいることで、
関数型、特に haskell はそれ(副作用の分離)を言語仕様として組み込んでいる、
ただそれだの事。

宗教を持ち出してくる意味が分からない。
773デフォルトの名無しさん:2012/09/15(土) 14:24:57.35
どっかで見たHaskellネタを真に受けただけだろ、放っておいてやれよ
774デフォルトの名無しさん:2012/09/15(土) 14:38:32.29
>>772
唯一まともな回答をしてくださってありがとうございます
完全に同意です。別にドカタ言語でも当たり前のことですよね
いや、異常に神聖視してる狂った人が大暴れしてたりしてるので
は?何言っちゃんてんのコイツと思った次第です
775デフォルトの名無しさん:2012/09/15(土) 14:43:19.64
最後の一行にも同意したの?
776デフォルトの名無しさん:2012/09/15(土) 14:44:28.20
はい。Haskell信者がなぜあそこまでHaskellを盲信するのか意味が分からないので
別に大したことないのに
777770:2012/09/15(土) 14:45:22.37
>>774
そんなのは狂った人だと分かっていながら、
>>761 のような質問を投げてきたのか。

要するにお前は暇だからただ単に嫌みを言いに来ただけではないのか。
もしそうなら狂ってるのはお前だ。
778デフォルトの名無しさん:2012/09/15(土) 14:47:55.97
Haskellネタで遊ぶ人が多いからこういうのが出てくるんじゃねーの
779デフォルトの名無しさん:2012/09/15(土) 14:48:49.65
宗教の話を最初に持ちだしたのは自分なのに>>776みたいなレスを返すあたり、
は?何言っちゃってんのコイツという感じですね
780デフォルトの名無しさん:2012/09/15(土) 14:49:19.95
客観的には狂った人かもしれないけど、それがHaskellerなのかなとも思いました
なにせ彼には日本語が通じなかったので
Haskellerがまともな思考を持ってるか確認するためにこのスレに質問しに来たのですが
やはり彼が例外的に狂ってるだけのようなので安心しました
781デフォルトの名無しさん:2012/09/15(土) 14:50:34.73
どこかでHaskeller使いに馬鹿にされて
悔しくて発狂しちゃったんだろうね

ドカタがリアルでHaskell使いと接点あるわけないから、2chの他スレかな
782デフォルトの名無しさん:2012/09/15(土) 14:51:52.87
Haskellerはドカタという言葉が好きなんですね。彼も他人をそう呼んでたので
783デフォルトの名無しさん:2012/09/15(土) 14:53:00.53
よく分からんけど、目的を果たしたんならもう帰ったらいいんじゃないかな
784デフォルトの名無しさん:2012/09/15(土) 14:53:55.14
一般的に広く使われてるドカタ言語がHaskellに逆立ちしても敵わない理由はなんですか?
785デフォルトの名無しさん:2012/09/15(土) 14:56:04.92
ドカタと最初に言い出したのは自分なのに>>782みたいなレスを返すあたり、
は?何言っちゃってんのコイツという感じですね
786デフォルトの名無しさん:2012/09/15(土) 14:56:35.36
関数型言語って普通に人には扱えないヤバイ設計になってるんでしょうか
787770:2012/09/15(土) 14:58:12.03
>>780
質問する前に過去レスを読むのは当たり前のことだろ。
過去レスをじっくり読んだら質問する前に答えが得られるはずだ。
安易にバカみたいな質問するな。

そして、あえて質問するにしても、質問の仕方に配慮がなさ過ぎる。
本気で知りたいのなら、もっと丁寧に言葉に気をつけて文を練ろ。
べつに急ぎの質問でもないのだろ。
なら1日くらいよく考えてから質問しろ。

極簡単なこの2点が全くできてないのはわざとか。
俺にはわざととしか思えんが。
どちらにしても、お前も気が狂ってると言われても仕方ないな。
788デフォルトの名無しさん:2012/09/15(土) 14:59:28.81
>>786
設計とは何を指していますか?
789デフォルトの名無しさん:2012/09/15(土) 15:07:04.35
>>786
普通の人も扱える
ただ、普通の人が扱ったら、普通の人が保守できない設計になってる
790デフォルトの名無しさん:2012/09/15(土) 15:08:33.69
週末基地害が暴れてる。ID付きにして欲しいね
791デフォルトの名無しさん:2012/09/15(土) 15:14:58.05
>>787
別に急いではないけど、明日に持ち越すほど本気で知りたいとは思ってないです
Haskellerがどんな人達なのか見たかっただけ
だから別にそこまで気を張って質問しようとも思いません
ただHaskellerがあまりに手続き型言語を馬鹿にしていて、
(Haskellを使ってないからって馬鹿にされる筋合いはないし、手続き型言語の方が普通に使えるという事実があるので)
もしかして彼らは現実が見えてないんじゃないかと憤慨したのですが
このスレの何人かはそこまでアホじゃないようなので安心した限りです
792デフォルトの名無しさん:2012/09/15(土) 15:17:08.78
どんだけ偉そうなんだよコイツww
793デフォルトの名無しさん:2012/09/15(土) 15:28:28.20
> 手続き型言語の方が普通に使えるという事実があるので

わざわざこういう文章をここに書き込むところが基地外
794デフォルトの名無しさん:2012/09/15(土) 15:29:27.45
解った解った
事の発端は心無いHaskellerがドカタゲンガーに唾を吐いた事に因るものだ

Haskellerの中にもごろつきはいるので
そいつに虐められた奴がここに恨み節ぶちまけてるんだろう

こういったいざこざはごろつき同士だけで済ませて欲しいもんだ
795デフォルトの名無しさん:2012/09/15(土) 15:50:14.31
Haskellを批判した時点でドカタに決定したらしく、馬鹿らしくて否定する気にもならなかったが
京大院生(もちろんロンダ)だから近い将来ドカタになるかもしれないね
うちは情報学研究科だけどプログラミングマニアが来る専攻ではないから
Haskellerがおらず直接言う機会がないから、このスレにいるゴロツキに釘を刺したかったために
そうでない数人が不快な思いをしたことは認める
796デフォルトの名無しさん:2012/09/15(土) 15:58:02.55
日本語でおk
797デフォルトの名無しさん:2012/09/15(土) 17:18:15.27
Haskellを使えることがステータスか何かだと思ってる奴

Haskellが副作用をどうやって扱ってるかも知らないのに有効な批判ができると思ってる奴
が出会えばいざこざが起こるのは必然だな
関わりたくない
798デフォルトの名無しさん:2012/09/15(土) 17:52:39.53
バカ同士の争いをこのスレに持ち込まないで。
2ちゃんねる以下の争いを。
799デフォルトの名無しさん:2012/09/15(土) 18:18:01.23
>>797
前者みたいにHaskellのことを説明できないただの権威主義者がいるだけでいざこざは起こるよ
800デフォルトの名無しさん:2012/09/15(土) 22:53:51.05
むしろ2chならこんなもんだと思うけど
801デフォルトの名無しさん:2012/09/16(日) 05:39:44.32
ペアのベクタよりベクタのペアの方がパフォーマンス良いの?
802デフォルトの名無しさん:2012/09/16(日) 10:29:25.65
>>801
まず自分で比較検討してみろ。

こんな実験方法でこんな結果が出ましたが妥当でしょうか?
という質問の仕方をしてくれ。
803デフォルトの名無しさん:2012/09/16(日) 10:43:55.39
>>802
答える気が無いなら黙ってろよ
804デフォルトの名無しさん:2012/09/16(日) 10:48:48.34
ようするに、

比較検討なんて面倒なんでそっちでやってくれ。
で、どっちが早いか結果だけさっとさ教えてくれ。
それができなきゃレスするな。

という質問だろ?
805デフォルトの名無しさん:2012/09/16(日) 20:29:08.85
>>802
(´・ω・`)はい
806デフォルトの名無しさん:2012/09/17(月) 17:59:46.02
readのように、
様々な型の値を返す関数は
どうやって書けば良いのですか?
807デフォルトの名無しさん:2012/09/17(月) 18:07:10.86
型クラス
808デフォルトの名無しさん:2012/09/17(月) 22:34:13.35
リストxsの要素xでf(x)を最大(最小)とするようなものを探す
(Ord b)=> (a->b)->[a]->a
型の関数ってどっかにないの?
809デフォルトの名無しさん:2012/09/17(月) 22:46:26.46
foldr1 (\x y -> if f x < f y then y else x)

をもう少しコンパクトに書ければいいが
810デフォルトの名無しさん:2012/09/17(月) 23:24:10.76
自分のコードではf x < f y を on (<) f x y にしてたけど、短いかと思いきやむしろ長くて読みにくいだけだったでござる

minBy, maxBy::(a->b)->a->a->a
とか需要あると思うんだけど、案外用意されてないんですね…
811デフォルトの名無しさん:2012/09/17(月) 23:30:30.84
コンパクトに書くことよりも、読んですぐに意味が分かるコードにした方が良いと思う。

もちろん、もっとコンパクトにした方が意味をくみ取りやすいのなら、そうすべきだが。
812デフォルトの名無しさん:2012/09/17(月) 23:35:45.92
>>808
{-# LANGUAGE NoMonomorphismRestriction #-}
import Data.List
import Data.Ord
maximumWith = maximumBy . comparing

こんなん出ました。
死ね、単相性制限。
813デフォルトの名無しさん:2012/09/17(月) 23:45:14.99
>>812
型宣言を省略するからそういう事になる
814デフォルトの名無しさん:2012/09/17(月) 23:56:16.16
import Data.Function (on)
import Data.List (maximumBy)

maximumWith :: Ord b => (a -> b) -> [a] -> a
maximumWith f = maximumBy $ on compare f

このfを消したくなるのは病気
815デフォルトの名無しさん:2012/09/18(火) 00:03:41.76
細かい事だけどmaximumWithよりはargmaxの方が良い名前
816デフォルトの名無しさん:2012/09/18(火) 00:05:56.26
maximumWithはパクった
自分の頭ではmaximumFとかmaximum'とか本当に酷いのしか思い浮かばなかった
817デフォルトの名無しさん:2012/09/18(火) 00:09:00.12
ワロタ、正直だな
818デフォルトの名無しさん:2012/09/18(火) 00:09:53.02
>>814
> このfを消したくなるのは病気

maximumWith = (maximumBy .) $ on compare

と、ついやってしまうって事?

それなら確かに病気だ
819デフォルトの名無しさん:2012/09/18(火) 13:43:41.26
らんらんるー
820デフォルトの名無しさん:2012/09/19(水) 00:09:53.82
自己書き換えを制限、gotoを制限、
動的型を制限、オブジェクトに制限
こうやって複雑さを増やすコードに制限をもうけることで大規模なプログラムが作りやすくなる。
821デフォルトの名無しさん:2012/09/19(水) 00:11:51.04
822デフォルトの名無しさん:2012/09/19(水) 01:06:09.10
>>820
言語仕様で制限された機能を実現するプログラムを作るための教育コストを考えてほしい
823デフォルトの名無しさん:2012/09/19(水) 07:14:44.19
>>822
なんで必要な機能がデフォルトで制限されている、あるいは無いHaskellの
プログラマを教育しようとするの。

その機能が必要だと分かっているのなら C/C++ のプログラマを教育すればいいじゃん。
Javaで十分ならJavaプログラマを教育すればいいわけだし。

Haskellでプログラムする必要性がなければ、
無理に制限された機能を実現する必要は無いんだぞ。
824デフォルトの名無しさん:2012/09/19(水) 07:50:36.00
Haskellで制限されてて困ってる機能を
具体的にくわしく
825デフォルトの名無しさん:2012/09/19(水) 16:17:46.79
>>824
goto
826デフォルトの名無しさん:2012/09/19(水) 18:53:43.42
Monomorphism Restriction
827デフォルトの名無しさん:2012/09/19(水) 19:27:06.56
>>825
どういう状況で goto がなくて困った?


>>826
どのような状況で Monomorphism Restriction がなくて困ったのでしょうか。
828806:2012/09/19(水) 19:59:36.28
>>807
ありがとうございます
取り合えずこんなのを書いてみたんですがダメでした……

{-# LANGUAGE FlexibleInstances #-}
class FilterContext a

instance FilterContext [a]
instance FilterContext ([a], [a])

filter' :: (FilterContext b) => (a -> Bool) -> [a] -> b

filter' = filter

filter' p xs = (ts, fs)
where ts = filter p xs
fs = filter (not.p) xs
829デフォルトの名無しさん:2012/09/19(水) 22:01:27.55
一番外側のループは手続きでやりたいときもある
830デフォルトの名無しさん:2012/09/19(水) 22:06:30.41
>>829
意味が分からない
831デフォルトの名無しさん:2012/09/19(水) 22:38:01.25
>>828
filter'をclass FilterContextのメソッドにしろ。
それぞれのインスタンス宣言で実体を定義しろ。
832デフォルトの名無しさん:2012/09/19(水) 22:42:44.87
{-# LANGUAGE FlexibleInstances, TypeFamilies #-}
import Prelude hiding (filter)
import qualified Prelude

type family Elem a :: *

type instance Elem [a] = a
type instance Elem ([a],[a]) = a

class FilterContext b where
filter :: (Elem b ~ a) => (a -> Bool) -> [a] -> b

instance FilterContext [a] where
filter = Prelude.filter

instance FilterContext ([a],[a]) where
filter p xs = (ts, fs)
where ts = filter p xs
fs = filter (not.p) xs

こういう事がやりたいんだろうか
一々型アノテーション付けるの面倒じゃないかなぁ・・・
833デフォルトの名無しさん:2012/09/20(木) 01:12:30.86
>>827
関数の途中で未処理の計算を保存したまま一旦プロンプトを出して問い合わせ処理を行いたいときにgotoがなくて困った
834デフォルトの名無しさん:2012/09/20(木) 01:20:19.18
Continuation使えばよくね?
835デフォルトの名無しさん:2012/09/20(木) 05:27:58.43
>>834
Continuation の教育コストを考えてほしい
836デフォルトの名無しさん:2012/09/20(木) 07:15:09.59
>>835
教育を受ける人のやる気とか能力による。

普通に Haskell で何かアプリを作れる人なら、
全く苦にならずに理解できる。
837806:2012/09/20(木) 14:49:01.48
>>831,832
ありがとうございます、うまくいきました
type familyとかtype instanceとか、(Elem b ~ a)は
haskell 2010 language reportに無いような気がするのですが、GHC独自の拡張ですか?
type familyとtype instanceについてはGHC users guidの7.7に説明が見つけられたのですが、
(Elem b ~ a)はどういう意味なんでしょうか。

型アノテーションについてですが、確かにそうなんですが、
内部のあまり直接触れないものであるけど、最適化の為にまとめた方が良いような処理の場合、
複数の関数を作るよりまとめてしまったほうがいいかな、と思ってこういう事に興味を持ちました。
内部で用いる場合は大体letなどの代入で用いるので、その場合は型アノテーションは省略出来る事も多いと思い、
関数名が減る利点のみを得られるかと思います。

しかしなんか型システムを騙すために色々やらなきゃならないんですね……
838デフォルトの名無しさん:2012/09/21(金) 16:43:10.99
「Elem b ~ a」は「Elem bとaは同じ型である」って意味ですね
ただまあ832の例は関数従属と多引数型クラスでも複雑にはならない

{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses, FunctionalDependencies #-}
module Mult where
import Prelude hiding (filter)
import qualified Prelude as P
import qualified Data.List as L

class FilterContext a b | b -> a where
  filter :: (a -> Bool) -> [a] -> b

instance FilterContext a [a] where
  filter = P.filter

instance FilterContext a ([a], [a]) where
  filter = L.partition

*> filter (> 5) [1..10] :: [Int]
[6,7,8,9,10]
*> filter (> 5) [1..10] :: ([Int], [Int])
([6,7,8,9,10],[1,2,3,4,5])
839デフォルトの名無しさん:2012/09/21(金) 23:33:42.96
>>836
断言するが、プログラマのやる気と能力を必須とする言語はウンコ
840デフォルトの名無しさん:2012/09/21(金) 23:47:50.17
>>839
縦列駐車もおぼつかないクズが、F1マシンをウンコと言ってるようなもんだな(´・ω・`)
841デフォルトの名無しさん:2012/09/21(金) 23:48:10.76
うんこプログラマはヤル気も能力も無くていいのか。
842デフォルトの名無しさん:2012/09/21(金) 23:57:06.43
>>839
それがどうかしたか?

嫌ならHaskellやめろよ
843デフォルトの名無しさん:2012/09/22(土) 00:50:34.39
>>840
断言するが、日本の公道に置いてあるF1マシンはウンコ
844デフォルトの名無しさん:2012/09/22(土) 00:51:50.24
>>842
だったら、法律でHaskell言語を指定して注文を出すのを禁止すべき
特に大学
大学なんだから自分たちで作れ!!!
845デフォルトの名無しさん:2012/09/22(土) 01:02:15.71
ちょっと何言ってるかわかんないですね
846デフォルトの名無しさん:2012/09/22(土) 01:17:36.38
>>843
皆乗りこなしてるから安心しろw
847デフォルトの名無しさん:2012/09/22(土) 02:44:58.71
>>838
使うときにaの型がはっきりしていれば、関数従属いらないよね

*Mult> filter (> (5::Int)) [1..10] :: [Int]
[6,7,8,9,10]
*Mult> filter (> (5::Int)) [1..10] :: ([Int], [Int])
([6,7,8,9,10],[1,2,3,4,5])

だから、この問題に関数従属が必須とはいえないが… たしかに使えば便利かも… 悩む
848デフォルトの名無しさん:2012/09/23(日) 01:26:55.71
>>839
簡単な問題は、大抵の言語で解ける。
解くべき問題が難しい場合は、まず解くための記述力が優先であって、扱いやすさは熟れた後から付いてくるもの。
849デフォルトの名無しさん:2012/09/23(日) 01:50:28.65
つまんない議論だな、分からない腹いせにウンコとかw

こういうところが分かりづらかったとか、分からないとか、建設的な話をしようず
850デフォルトの名無しさん:2012/09/23(日) 04:04:53.83
教育方法が分からない
851デフォルトの名無しさん:2012/09/23(日) 08:16:38.24
本を読め
852デフォルトの名無しさん:2012/09/23(日) 09:22:32.71
教育って現場での教育?
入門書を読ませるのでは駄目なの?
853デフォルトの名無しさん:2012/09/23(日) 10:32:49.97
Haskellは漢字と同じ
仮名を知らないやつに漢字を教える方法がわからない
854デフォルトの名無しさん:2012/09/23(日) 10:42:21.90
ピンインの無い時代の中国人は直接漢(ry
855デフォルトの名無しさん:2012/09/23(日) 12:10:15.29
教育方法が分からないものを現場で使うなんていう判断は普通はしない
856デフォルトの名無しさん:2012/09/23(日) 12:15:08.32
おまえが教育ができないバカというだけ
ついでにマルチ書き込みするバカでもあるな
857デフォルトの名無しさん:2012/09/23(日) 14:35:44.74
>>855
使用する言語を自由に選べるソフト会社はごく一部
858デフォルトの名無しさん:2012/09/23(日) 14:51:30.87
やる気のない奴に教えるのが難しいのは分かるけど、言語関係なくね?
>>855はどういう言語なら教育できるのか
なぜそれがHaskellだと通用しないと思うのか
859デフォルトの名無しさん:2012/09/23(日) 14:52:36.17
>>857
普通、そのような選択肢の少ない会社は C/C++ か Java か、
せいぜい C# くらいしか選べない。

が、これらはたいてい、少なくともその会社のアプリを作るに当たっては、
教育コストはそれほど高くなく、また実績も数多くあるので、
教育方法が分からないものを現場で使うなんて判断はしない。
860デフォルトの名無しさん:2012/09/23(日) 14:55:45.78
>>859
分かりにくくてすまない

>>855>>850 の「教育方法が分からない」を受けて
>>852 が言った「教育って現場での教育?」を俺(>>855)が受けてのレスだ。
861>>860:2012/09/23(日) 14:56:46.07
うわーごめん

>>860>>858 へのレスね
862デフォルトの名無しさん:2012/09/23(日) 15:02:00.13
自然言語だとSecond Language Acquisitionとかいう分野で、
言語を使えるようになるメカニズムとか、効率的に教えるor覚えるのはどうするのか、とかよく研究されてるけれど
プログラミング言語でも、そういう研究されてたりするのかな?
863デフォルトの名無しさん:2012/09/23(日) 15:07:17.26
>>859
大学の研究室から受注するのはHaskellとかLispが多い
864デフォルトの名無しさん:2012/09/23(日) 15:11:36.90
>>863
あ、そうなんだ。

すまん、その辺りは正直よく分からん。
大学関係と仕事したことない。
865デフォルトの名無しさん:2012/09/23(日) 15:12:20.98
>>858
Cはシンタックスを覚えさせて、その後、例外処理教えて、その後、開発プロセスの教育に入る
JavaやCobolも同じ

Haskellは例外処理と開発プロセスを教えるときの計算モデルが事例ごとに個別に存在するから教育が難しい
(CやJavaみたいにフローモデルで統一できないので、公理的な原則から演繹する方法がとれない)
866デフォルトの名無しさん:2012/09/23(日) 17:04:27.55
>>865
「計算モデル」という言葉をどういう意味で使ってるのかピンとこないけど、
フローモデルというのが制御フロー(フローチャートとか)のことだとすると、
それはHaskellでそのまま通用すると思う
Haskellだと、第二原則として「入力から出力への関数を書く」というのを
制御フローの次にもってくればいいんじゃね

どうせ「公理的な原則から演繹」するだけで書けるプログラムなんてほとんどないんだから
(たとえば、制御フローを気にしてるだけじゃCやJavaでデータ構造は設計できない)
そんなに大きい問題には見えないけどどうだろう
結局、構文を覚えた後はコードを書いてもらって、それをレビューするというのを
繰り返すしかないし、これは言語に関係ない
867デフォルトの名無しさん:2012/09/23(日) 23:52:03.91
Haskell - Debug Print in if block
ttp://stackoverflow.com/questions/12550276/haskell-debug-print-in-if-block

これもっと早く知りたかったわ
868デフォルトの名無しさん:2012/09/24(月) 01:46:42.01
>>866
CやJavaは「こっち行った後にここでこう飛んで…」みたいな感じで、説明できる
つまり、CやJavaのコードを読むことは、どんなトリッキーなコードも結局は、機械語や擬似コードの羅列を上から下に追ってgotoで飛ぶ作業「だけ」に還元できる

Haskellのコードを読むことを、教育者が簡単に提示できる何かの作業「だけ」に還元できるだろうか
869デフォルトの名無しさん:2012/09/24(月) 07:02:27.96
>>868
簡約するだけ
870デフォルトの名無しさん:2012/09/24(月) 12:50:33.66
Haskellの本ならProgramming In Haskellが良かった
薄いし計算モデルも簡単に説明してるしHaskellのパワーも一通りわかるし
がっつりやらせたければSICPでも読ませとけばいいんじゃね?
871デフォルトの名無しさん:2012/09/24(月) 13:03:59.29
ってか俺は計算モデルよりむしろ
GHCの拡張含めたHaskellの型システム使いこなしのコツ的チュートリアル欲しい……
872デフォルトの名無しさん:2012/09/24(月) 17:17:29.82
>862
ソフトウェア開発で言語そのものの関与は低い。
だからあまり考えられたいないはず。
873デフォルトの名無しさん:2012/09/24(月) 19:01:21.20
使いこなしのコツ的なのは所謂チュートリアルで学べるものではないと思う。
型族とかGADTとか関数従属性とか、個々の使い方はチュートリアルで学べるけどね。

俺はどちらかというと、そういう技を見事に活用したライブラリの紹介などの、
ベストプラクティス集みたいなのがほしい。

探しても誰も紹介してないから、仕方なく暇をみつけて
自分でライブラリ漁ってコツコツと使い方コレクションを作ってる。
874デフォルトの名無しさん:2012/09/25(火) 02:07:42.43
あれはあれ、これはこれ、でTipsにしか見えないイデオムが多くて困る
875デフォルトの名無しさん:2012/09/25(火) 15:44:53.23
>>973
うp
876デフォルトの名無しさん:2012/09/25(火) 19:25:48.94
>>875
いや、まだ人様にお見せできる状態じゃないよ。
ライブラリのソースと、「abc.hs で**という使い方してる。スゲー」
とか書いたちょっとしたメモとを紐付けして保存してるだけ。

どちらかというと、ぱっと見て気にかかったことを忘れないようにメモってる感じ。
cabal でライブラリをインストールする時はいつも、
インストール処理中にソースをざっと眺めるようにしてるから。

いつか読み返して、他とも関連も併せてちゃんとまとめ直したい。
877デフォルトの名無しさん:2012/09/25(火) 20:40:09.02
haskellwikiあたりにこっそりページ作って
コード片と出典と簡単なコメントつけるだけでも
結構需要あるんじゃないかなあ
878デフォルトの名無しさん:2012/09/25(火) 23:49:47.98
どっちのスレに書き込むべきか悩んだんだけど,Haskellに限った話なのでこっちに.
Haskell Platform付属のEmacs用haskell-modeってyasnippet.elと相性悪い?
TABがhaskell-modeのインデンテーション補完に取られてyasnippetの$0とか$1の位置に動けない.スニペット展開すると即確定になる.
879デフォルトの名無しさん:2012/09/27(木) 00:33:24.95
yasnippetをC-TABにしてる俺は問題ない。
880デフォルトの名無しさん:2012/09/27(木) 02:09:08.89

男ならメモ帳だろ
881デフォルトの名無しさん:2012/09/27(木) 09:23:42.82
便乗してぼやくと、vimにneco-ghc入れても、AutoComplPopが補完メニューを展開してくれないからつらい
882デフォルトの名無しさん:2012/09/27(木) 16:30:15.23
日本法人のツイートはウソばかり。って有名だが。
都合が悪い時は黙る。とかね。
883デフォルトの名無しさん:2012/09/27(木) 19:04:57.90
どこからの誤爆だ?
884デフォルトの名無しさん:2012/09/27(木) 22:13:11.00
Twitter全体に言えそう
885デフォルトの名無しさん:2012/09/27(木) 23:33:49.86
Haskellのtwitter API ってどれがメジャー?
886デフォルトの名無しさん:2012/09/28(金) 01:06:58.11
haskellってファイバー使える?
887デフォルトの名無しさん:2012/09/28(金) 11:12:18.81
使えたとしても副作用があるので隔離される
副作用がないならシングルスレッドで簡約した場合と全く同じ結果になるはずだ
888デフォルトの名無しさん:2012/09/28(金) 17:14:04.32
用法としてはStateモナドが近い
889デフォルトの名無しさん:2012/09/28(金) 23:06:06.94
ファイバーと継続とモナドとajaxは近い
890デフォルトの名無しさん:2012/09/29(土) 13:55:57.95
Haskellのdataはなんで代数的データ型と言うの?

C言語のstructは代数的データ型とは言えないの?
891デフォルトの名無しさん:2012/09/29(土) 14:40:13.63
andとorがあって再帰的定義できてこその代数型
892デフォルトの名無しさん:2012/09/29(土) 14:43:00.27
代数的データ型は何らかの代数的構造を持つデータ型だ、と考えていい?

逆に言えば、代数的構造を持たないのは代数的データ型ではない?
893デフォルトの名無しさん:2012/09/29(土) 14:50:31.72
>>892
駄目
間違い
894デフォルトの名無しさん:2012/09/29(土) 15:31:09.97
じゃあ、Haskellにおける「代数的」ってどういう意味なんだ?
895デフォルトの名無しさん:2012/09/29(土) 15:38:43.56
896デフォルトの名無しさん:2012/09/29(土) 16:04:28.53
すまん
「andとorと再帰的定義」 これと 「代数」 これの関わりを
もう少し説明してくれないだろうか。

Haskellのデータ型でのandとorというのは、次のこと?

(and) => data A = X a b c
(or) => data A X | Y

あと、再帰的定義ができることも分かる。

しかし、どのあたりが代数なのか、俺は他人にちゃんと説明できないんだ。
897896:2012/09/29(土) 16:05:10.62
>>896
ミスった(イコールを忘れた)

(or) => data A = X | Y
898デフォルトの名無しさん:2012/09/29(土) 16:20:08.39
勉強はじめたところでオレも良く分かっていないが…

代数的データ型の「代数的」な所以は代数のクラスを抽象化するのに
必要十分なだけの情報を持っていることじゃないかな。

例えば、「単位元と二項演算子を一つ持つ」代数のクラスを考えた場合、
data A= Unit | Op A A

という代数データ型があれば

0 + (0 + 0)も
1 + (1 * 1)も

Op Unit (Op Unit Unit)という式に抽象化することができる。
(これが、X |-> 1 + X * X なる関手の始代数である、ということだと思う)

こういう抽象化ができる、というかこういう抽象化によって見出すことができるデータ型が代数的データ型ということ
じゃないかなぁ、というのが勉強を始めてところの今の理解
899デフォルトの名無しさん:2012/09/29(土) 16:25:42.31
なるほど。

代数的構造を持っているのではなくて、
代数的構造を表現できるから代数的データ型なのか。
900898:2012/09/29(土) 16:33:41.99
あ、

> 1 + (1 * 1)も



> 1 * (1 * 1)も

の誤記。すまん。


ついでに、書いておくと
>>898の例で、

concrete :: (a, a -> a -> a) -> A -> a
concrete (u, _) Unit = u
concrete a@(_, o) (Op x y) = o (concrete a x) (concrete a y)

という関数があれば、Aで作られた抽象的な式を、具体的な式に復元?することもできる。
concrete (0, +) (Op Unit (Op Unit Unit)) === 0 + (0 + 0)
concrete (1, *) (Op Unit (Op Unit Unit)) === 1 * (1 * 1)
901デフォルトの名無しさん:2012/09/30(日) 00:45:34.84
代数的って言葉に特に定義ないよ。そもそものところでブレてるし。
少なくとも統一見解はない。
902デフォルトの名無しさん:2012/09/30(日) 00:56:45.35
>>901
一般じゃ無くて、Haskell の data で定義できる型に限ったことでいいよ。
そこにおける「代数的」ってどういう意味、という話。
903デフォルトの名無しさん:2012/09/30(日) 01:12:40.48
そんなに不思議かな
代数とは「集合とその集合の上に定義された演算の対」
904デフォルトの名無しさん:2012/09/30(日) 01:13:42.99
×演算
○演算の集合
905デフォルトの名無しさん:2012/09/30(日) 01:18:38.63
演算の間の代数的な関係によって型を規定するから代数的
906デフォルトの名無しさん:2012/09/30(日) 03:54:11.23
つ 多ソート代数
907デフォルトの名無しさん:2012/09/30(日) 07:40:02.29
>>902
それだったら抽象データ型の理論から始まったやつだ。
このイントロでも読め
http://ci.nii.ac.jp/naid/110003743901
Goguenが始まりだとさ。

一般興味あるなら
Modern Algebra and the Rise of Mathematical Structures
http://www.amazon.co.jp/dp/3764370025
だな。ただ数学的内容は眉唾な部分があるので気を付けないといかん。
俺はもう読む気しないから誰か読んで。
908デフォルトの名無しさん:2012/09/30(日) 09:19:08.01
>>907
おぉ、ありがと。
その論文からいろいろ辿ってみるよ。


> 数学的内容は眉唾な部分があるので
え、どゆこと?

数学的内容の本なんじゃないの?
計算機科学が主で、道具としての数学を解説してる本ってこと?
909デフォルトの名無しさん:2012/09/30(日) 09:33:01.21
数学的構造と呼ばれるものが何処で発生したのかという数学史の本。
計算機科学なんか全く出てこない。数学一般において代数的という言葉が
どういう変遷をたどったかという本だ(と思う)から。
ほんと気になる人向けという意味で上げた。
910デフォルトの名無しさん:2012/09/30(日) 12:52:53.72
そういうものなら、
代数学の歴史−アル・クワリズミからエミー・ネーターへ−
http://www.gensu.co.jp/book_print.cgi?isbn=978-4-7687-0220-8
が好書。
911デフォルトの名無しさん:2012/09/30(日) 13:00:55.44
912デフォルトの名無しさん:2012/09/30(日) 15:34:59.22
数学だと、(加算と)乗算が定義された集合を代数と呼ぶ
913デフォルトの名無しさん:2012/09/30(日) 16:05:06.03
狭義のalgebraは日本語だと多元環。
今、話題になってるのはこっち。
914デフォルトの名無しさん:2012/09/30(日) 16:13:25.09
聖域ってなんかエロいよね
915デフォルトの名無しさん:2012/09/30(日) 20:11:46.33
>>910
そういうので代替が効くんならわざわざあげないよ。
目次見ろ
http://books.google.co.jp/books?id=WdGbeyehoCoC&pg=PP8&lpg=PP1&hl=ja#v=onepage&q&f=false
それで誰か読み込んでくれ(特に7章)。
916デフォルトの名無しさん:2012/09/30(日) 20:13:28.95
俺はもうやらん。
917デフォルトの名無しさん:2012/09/30(日) 20:58:52.21
>>915
>>910の方がずっと目的にあってるよ。
918デフォルトの名無しさん:2012/09/30(日) 22:05:54.35
代数データ型という言葉をはじめて聞いた時は
単なる構文的等値でない等値性が用意されているのかと誤解した。
「可換的」とか「結合的」とかキーワードが用意されていて、T a (T b c) = T (T a b) cになるとか。
919デフォルトの名無しさん:2012/09/30(日) 22:36:58.00
「ストラウストラップのプログラミング入門」的な本がHaskell(関数型)にも欲しいよな。
920デフォルトの名無しさん:2012/10/02(火) 21:41:35.30
関数型言語で例示してるアルゴリズム本がほしい
921デフォルトの名無しさん:2012/10/02(火) 22:11:02.00
>>920
「Pearls of Functional Algorithm Design」
すばらしい
922デフォルトの名無しさん:2012/10/03(水) 19:01:20.45
HashMapがあればMapやIntMapは退役?
923デフォルトの名無しさん:2012/10/03(水) 19:14:56.09
>>922
退役かどうかは人によるだろ。
使用中のメモリの変化も違うし、計算速度も違う。

自分が書いたプログラムのMapやIntMapを使ってる部分をHashMapに変えて、
プロファイルを取ってみるといい。
924デフォルトの名無しさん:2012/10/03(水) 20:28:28.60
はい(´・ω・`)
925デフォルトの名無しさん:2012/10/04(木) 22:04:48.83
>>920
そのものズバリの
"Algorithms: A Functional Programming Approach"
はどうですか?
926デフォルトの名無しさん:2012/10/04(木) 22:09:02.57
機械学習を専門としている博士課程の学生です。
C++を15年くらい使ってきました。
そしたら、とある本に
Haskellを使えばコーディング時間がC++の10分の1くらいになるよ
(実行速度はちょっと遅くなるけど)
と書いてあったので、Haskellを使ってみたいと考えています。
C++プログラマーがHaskellを勉強するには、どんな本がオススメでしょうか?

あと、本当にコーディング時間(デバッグ時間を含む)は
10分の1くらいになるのでしょうか?
927デフォルトの名無しさん:2012/10/04(木) 22:13:42.93
>>926
静的型付けが役に立つほど仕様が固まってデカイコードなの?
完成品はc++で約何行ぐらい?
928デフォルトの名無しさん:2012/10/04(木) 22:43:22.44
>>926
どの言語をやっていようが関係ない

・すごいHaskellたのしく学ぼう!
・Haskell: The Craft of Functional Programming (3rd Edition)

このどちらかの本で学べばいい


ところで、「とある本」とは何だ?
変なところで伏せずに、ちゃんと明かしなさい
929 [―{}@{}@{}-] デフォルトの名無しさん:2012/10/04(木) 22:47:28.39
教養のためじゃなくてガチで使うなら>>5のThe Craftがおすすめ

>あと、本当にコーディング時間(デバッグ時間を含む)は
>10分の1くらいになるのでしょうか?
個人的には、C++と比較して1/10はかなり言いすぎに思える
体感的には1/2-1/3くらい
もちろん書くコードの種類や、言語の習熟度に強く依存するから、
1/10になるケースがないと主張するつもりはないけど
930デフォルトの名無しさん:2012/10/04(木) 23:12:47.56
15年使って慣れたパラダイムを離れるんだからな
コーディング時間が数分の1になっても元は取れないかもしれない
931デフォルトの名無しさん:2012/10/04(木) 23:18:15.19
機械学習だとCにはあってもHaskellには無いライブラリが
沢山ありそうだからそれも書くことになる
932デフォルトの名無しさん:2012/10/04(木) 23:31:31.09
まあライブラリはFFIで呼ぶとして、
実行速度のパフォーマンスが出ないときのチューニングがキツい予感
933デフォルトの名無しさん:2012/10/04(木) 23:41:16.52
対象データが大きいときついね。
たかだか百万エッジ程度のグラフでも色々工夫しないとメモリ不足になるかGCばかり走る状態になる。
934デフォルトの名無しさん:2012/10/04(木) 23:50:51.67
>>927
行数はわかりませんが、Hadoopくらいの複雑さを想定しています。
単体法や内点法のような数値計算もガリガリ書いています。

静的型付けが必要かと言われると、ちょっとわかりません。
数値計算部分はmatlabで書いたりするので。

>>928
情報ありがとうございます。
>>929さんも推薦しているので、
craftを買ってみようと思います。

とある本とは、非公開会議の資料なので、伏せさせてください。

>>929
なるほど、1/10は誇張でしたか・・・
でも、仮に半分になったら嬉しいですね。

>>930
なるほど。
ただ、結局は機械語に帰着するので、そんなに違いはないような気もしますが。

>>931
そこは頑張って自作しようかと。

>>932
アセンブラレベルのチューニングはあまり重要視していないので、大丈夫かな・・・たぶん・・・
935デフォルトの名無しさん:2012/10/04(木) 23:59:26.96
>>928
・すごいHaskellたのしく学ぼう!
こっちもすごく良さそうですね!!
しかも、日本語なら少しだけ速く読めるので、
こっちがいいのかな・・・悩ましい・・・
936デフォルトの名無しさん:2012/10/05(金) 00:04:47.48
チューニング時間が10倍になって相殺される
937デフォルトの名無しさん:2012/10/05(金) 00:18:05.89
「すごいHaskellたのしく学ぼう!」が今のところ日本語の書籍ではダントツだと思うけど
C言語とかにどっぷり浸かってる人なら「ふつうのHaskellプログラミング」もいいと思うよ
938デフォルトの名無しさん:2012/10/05(金) 03:16:05.67
初めて知ったが、面白そうなんで貼ってみる。
http://www.well-typed.com/blog/70
The New Cloud Haskell
939デフォルトの名無しさん:2012/10/05(金) 13:22:20.43
>>925
これ絶版ですかね (´・ω・`)
940デフォルトの名無しさん:2012/10/06(土) 17:24:41.89
>>939
Amazon UK でまだ売ってる。

本体は38.99ポンド

通常発送(遅い方)の場合、
Amazon UK の設定するレートなら6196円で買える。
ポンドで買う(カード会社がレート設定する)なら46.97ポンド。
941デフォルトの名無しさん:2012/10/06(土) 23:21:50.32
>>925
読んだこと無いけど米密林では評判悪いね
942デフォルトの名無しさん:2012/10/07(日) 00:48:41.09
「Algorithms: A Functional Programming Approach」はアルゴリズムというよりは、
どちらかというとアルゴリズムを最適化するテクニックを多く学べる感じだ。

第3章からが本番。
関数の簡約の様子が詳しく書かれている。
所々、おまけでヒープの変化の様子を描いた図もある。
Burstall-Darlington 変換の考え方が学べる。

第4章のListの節はなかなか面白かった。
細かな最適化の話なんだが、関数合成時の中間データを省くテクニックや、
計算速度的には余計な結合演算(++)を取り除いたりするテクニックが学べる。
(後者はちょっと目から鱗だった)
あとはTreeやArrayの節でも同じように細かなテクニックが述べられている。

第5章はスタックやヒープなどのデータ構造を表現する方法が学べる。
ここは、個人的にはたいして面白くなかったな。
手続き型言語でよくあるデータ構造を関数型でいかに表現するかという事で、
まぁ実装方法は予想の範囲を超てなく、驚きがなかったから。
ただ、分かりやすくはあった。

第6章はソーティングの話だが、クイックソートよりも
マージソートやヒープソートの方が関数型では適している事が分かる。
各アルゴリズムの比較で、効率の計算が出てくるが、ちょっと難しいな。
なぜその計算になるのかの説明がちょっと簡略気味だ。
ただ、ここでも簡約の様子が図入りで載っているのは理解に助かった。

第7章からは、ちょっと飽きてきて、さらっと斜め読みしかしてない。
943デフォルトの名無しさん:2012/10/07(日) 00:51:30.99
一方「Pearls of Functional Algorithm Design」の方は、
各章毎に最初に「**がしたい」という課題が提示され、
その問題を解決するアルゴリズムをチープなものからハイレベルなものへと
徐々に進化させながら解説する本だ。

各章で、たいていは最初に "specification" と言って、
その問題の解を導く関数が持つべき性質が Haskell の文法で示される。
で、その specification を素直に満たす関数をまず作り、
そして、どこがなぜ非効率なのかを解説しながら少しずつ改良させていくわけだ。

ちになみに、タイトルには無いが、こちらも Haskell の本だよ。
944デフォルトの名無しさん:2012/10/07(日) 04:00:48.73
ゆうくんはHaskell本のだいせんせいなんだねぇ
945デフォルトの名無しさん:2012/10/07(日) 07:18:23.78
>>942,943
くわしい解説ありがとう!
946デフォルトの名無しさん:2012/10/07(日) 08:45:25.66
へーどっちも結構面白そうだな
おらなんだか欲しくなってきたぞ
947デフォルトの名無しさん:2012/10/08(月) 13:12:46.97
ghcにおいて、最適化オプションの有無によって
コンパイルするコードを変える事はできるでしょうか。

例えば、#ifdef #else #endif で分けるとか。
948デフォルトの名無しさん:2012/10/08(月) 13:42:31.29
>>947
C Pre-processor はどの言語でも使える嫌われてもいいのならバンバン使えばよい
949デフォルトの名無しさん:2012/10/08(月) 13:48:13.32
>>948
最適化オプション有りだとどんな名前のディレクティブが定義されるのでしょうか。
950デフォルトの名無しさん:2012/10/08(月) 14:14:40.77
>>949
いや、.hs を c の処理系ならもれなくついてくる cpp にかければいいというだけだ
cpp の持っているディレクティブならなんでも使えるはずだ
http://en.wikipedia.org/wiki/C_preprocessor

嫌われても知らない
951デフォルトの名無しさん:2012/10/08(月) 14:20:51.34
952デフォルトの名無しさん:2012/10/08(月) 15:30:28.95
>>950
c の処理系ならもれなくついてくる cpp にかければいいと言いますが、
ghc なら -XCPP オプションを付ければ .hs ファイルの中で #ifdef などが直接使えるので、
あとは最適化オプションを付けたときに、ghc 側でどのようなディレクティブが
自動で定義されるかが分かればできそうです。

それが分からないんですけどね。


>>951
プラグマを使って最適化時にコンパイルするコードを変える方法が
載っていないような気がするのですが、見落としてますでしょうか。
953デフォルトの名無しさん:2012/10/08(月) 18:58:47.52
まともな方法はないと思う
理論的には、Template Haskellは任意のIOを実行できるので、
OSの機能を使ってGHCに渡されてるオプションを調べたり、
デバッガを起動してGHCのメモリ内容を見たりすることは可能
954デフォルトの名無しさん:2012/10/08(月) 19:17:41.14
そういうのはビルド環境のツールでやればいい。
CabalとかSetup.hsとかmakeとか。
コンパイラになんでも詰め込んでしまうとろくなことない。
955デフォルトの名無しさん:2012/10/08(月) 19:31:35.45
>>954
コンパイラでやるのと Cabal でやるのとで、何か違いがあるのですか?
956デフォルトの名無しさん:2012/10/09(火) 10:51:23.68
baka
957デフォルトの名無しさん:2012/10/09(火) 12:13:42.86
       //
     /  /   バカッ
     //⌒)∩__∩
    /.| .| ノ     ヽ
    / | |  ●   ● |     
   /  | 彡  ( _●_) ミ  ワッフル ワッフル
   /  | ヽ  |∪|  /_
  // │   ヽノ  \/
  " ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ
958デフォルトの名無しさん:2012/10/09(火) 23:44:17.49
#lineディレクティブってghcは認識してくれるんだっけ?
959デフォルトの名無しさん:2012/10/09(火) 23:50:18.78
自分で調べろカス
960デフォルトの名無しさん:2012/10/10(水) 01:02:17.60
cppをプリプロセッサとして使えるらしいからOKのはず
961デフォルトの名無しさん:2012/10/10(水) 01:19:14.02
wxHaskellとgtk2hsの簡単な比較

起動時間比較 wx3秒。gtk0.5秒
導入の簡単さ wxの方が難しい
GUIコードの長さ wxの方が短い

以上、チラ裏でした

962デフォルトの名無しさん:2012/10/10(水) 07:04:24.44
GUIコードの長さってたいして変わらんと思うが

それよりも、wx は ghci 上で動かないのが痛い
963デフォルトの名無しさん:2012/10/10(水) 19:52:51.35
すごいH本でHaskell始めたのですが,質問です.14章1節のWriterでつまずいています.
エラーになってる関数は使っていませんが気にしないでください...
http://ideone.com/BXd8X
なコードが
Hoge.hs:7:18:
Couldn't match expected type `(a0, b0)'
with actual type `Writer w0 a1 -> (a1, w0)'
In the second argument of `($)', namely `runWriter'
In the expression: fst $ runWriter
In an equation for `getValue': getValue = fst $ runWriter
というコンパイルエラーで落ちるのですが,どこが悪いのでしょうか?
runWriterの引数の型を間違えていると読めますが,どうおかしいのか私にはわかりませんでした.
964デフォルトの名無しさん:2012/10/10(水) 20:19:27.49
>>963
(fst $) の型は (a, b) -> a だ。
これは、(fst $) は (a, b) 型の値に適用して a 型の値を返す、という意味だ。

あなたのプログラムでは、(fst $) を runWriter に適用している。

では、runWriter の型は (a, b) なのか?

違うよね。
runWriter の型は Writer x y -> (y, x) だ。

(fst $) は (a, b) 型の値に適用することが期待されているのに、
実際のプログラムソースでは (Writer x y -> (y, x)) 型の値に適用しようとしている。
マッチしないよ。

というのがエラーの内容だ。


で、あなたがやりたいことが getValue の型の通りだとするなら、
そこは fst $ runWriter ではなく fst . runWriter なのでは?
965デフォルトの名無しさん:2012/10/10(水) 20:41:36.50
>>964
なるほど,ありがとうございます.
格好つけてポイントフリースタイルみたいな書き方をしたが,実際にはポイントフリースタイルと($)を混同していたのがそもそもの問題だったのですね...
966デフォルトの名無しさん:2012/10/11(木) 06:41:52.69
fun $
このセクションの発想はなかったわ
967デフォルトの名無しさん:2012/10/12(金) 09:07:31.80
ぬるほ
968デフォルトの名無しさん:2012/10/12(金) 10:32:14.34
カッ
969デフォルトの名無しさん:2012/10/12(金) 17:24:54.69
Haskell Platform 2012.4.0.0 は順調なんでしょうか。
970デフォルトの名無しさん:2012/10/13(土) 03:58:23.47
Windows2000への再対応を切に望みます
なんせサポートをうたってるのですから
971デフォルトの名無しさん:2012/10/13(土) 04:03:13.40
そんなもん窓から投げ捨てろ
972デフォルトの名無しさん:2012/10/13(土) 20:58:29.89
せめて最後にこれぐらい紹介してあげなよ。
http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.13.362
973デフォルトの名無しさん:2012/10/14(日) 23:38:32.86
すいません、今、Mathematicaで行っている計算を
Haskellに移行したいと思ってます。

Haskellの学習はまだです。

Mathematicaでは次の操作を行って株価の一覧を作成してます。(そのほかにもいろいろな指標を計算してます)

・株式コードからURLを作成する
・URLが指定するWebページのHTMLを取得する
・HTMLから正規表現で現在の株価を抜き出す

これはHaskellでも可能でしょうか?
ライセンスの問題でMathemaricaを使い続けることが難しくなりました。

考え方が近いようなので関数型言語への移行が適切かなと思ってます。
(ExcelVBA版は作ったのですが速度に問題がありました…)
974デフォルトの名無しさん:2012/10/15(月) 00:37:25.30
可能

次の方どうぞ〜
975デフォルトの名無しさん:2012/10/15(月) 06:57:34.90
むしろmathematicaってそんなことできたんだ…
別に関数型言語じゃなくてもpythonとかperlみたいなLLでいい
976デフォルトの名無しさん:2012/10/15(月) 08:09:37.27
むしろその程度Haskellでできないと思う余地があるのか
977デフォルトの名無しさん:2012/10/15(月) 08:13:36.07
出来ない言語があったら教えてもらいたいレベルだな
978デフォルトの名無しさん:2012/10/15(月) 08:17:17.71
mathematicaすげえええええええええ
979デフォルトの名無しさん:2012/10/15(月) 08:18:09.00
gawkですら出来るレベルだからね
980デフォルトの名無しさん:2012/10/15(月) 08:53:03.35
>>976
>>977
すいませんでした。
VBAで作り直したとき、Webからのデータ取得や正規表現は
外部からCreateObjectで読み込んだので少し不安でした。
981デフォルトの名無しさん:2012/10/15(月) 10:50:24.53
Do not talk about Mathematica.
982デフォルトの名無しさん:2012/10/15(月) 13:22:19.13
>>973
>ExcelVBA版は作ったのですが速度に問題がありました…

この書き込みで最も有益な情報
983デフォルトの名無しさん:2012/10/15(月) 23:19:24.68
excel vbaのせいではない気がする
984デフォルトの名無しさん:2012/10/15(月) 23:42:55.22
こいつら低脳だな
実用的なことを一切やっていない
マジ低脳の極み

Perlが一番最高

こんなくそ言語やって何が楽しいんだ?低脳だろうなこいつら
インテイゲンチャきどっててきもちわりいわ
985デフォルトの名無しさん:2012/10/16(火) 06:03:39.02
>>973
webからデータ取得だけならLLで、って意見に同意。
もっともmathmaticaでも関数型プログラミング可能と謳っているからまずは
自分のコード見直してみたら?
Homeライセンスならグアム/サイパンでも行ったときホテルからUSDで買えば安いよ。
986デフォルトの名無しさん:2012/10/16(火) 19:44:48.95
ハスケラーが他の言語をdisっているのは
自信のなさの裏返しなのかな?
987デフォルトの名無しさん:2012/10/16(火) 19:49:46.79
他の言語をdisってるのよりも
他の言語ユーザをdisってるほうが良く見るな

馬鹿には無理、ってね
988デフォルトの名無しさん:2012/10/16(火) 21:19:33.55
Haskellが難しく感じるのはほかの言語に慣れてるからでしょ
「○○言語ならこう書けるのに、なぜこんな書き方をさせるんだ!!!」みたいな。
まったくのプログラミング未経験者ならCやJavaよりむしろ簡単だと思う
989デフォルトの名無しさん:2012/10/16(火) 21:26:45.58
あと何年かしたら普通にHaskellでプログラミング覚えたって世代が出てくるだろうからそれからだな
990デフォルトの名無しさん:2012/10/16(火) 22:37:05.09
>>988
> まったくのプログラミング未経験者ならCやJavaよりむしろ簡単だと思う

それはどうだろうか。
私は、どちらを先に始めたかではなく、それに触れるまのでの間に
どのような考え方に慣れているかに依ると思う。

人はたいてい小学生(あるいはそれ以前)の頃からずっと、
課題を解決するのに「手順」を考える事を学習させられてきた。
その中で、更に「状態変化・状態遷移」の概念も知らず知らずすり込まれる。

問題 X を解決するには A をやると x になって、
それから B をやると y になるから、
最後に C をやればできるよ、というような感じで。
理科の実験手順も、料理のレシピも同じ。

この考え方は C や Java を理解するのに適している。

静的な、宣言的な考え方なんて、手続き的な考え方に比べれば、
学校教育の現場でほとんど出くわすことはないだろう。
たとえ出くわしても、意識しなければ素通りしていくだけで、身にならない。

だから、そんな人間が初めてのプログラミング言語として関数型言語に触れても、
今までの生活では意識してこなかった考え方を求められる事に変わりはない。

手続き的な考え方よりも宣言的な考え方の方により慣れ親しんで初めて、
C や Java より Haskell の方が簡単と感じる可能性が出てくるのだと思う。
991デフォルトの名無しさん:2012/10/16(火) 23:23:49.59
関数型が普及していくのは間違いないけど、それがHaskellとは限らないな。
992デフォルトの名無しさん:2012/10/17(水) 00:00:38.66
学校教育の現場か
数列の帰納的定義をやらずに終わる高校もあるのかね
993デフォルトの名無しさん:2012/10/17(水) 00:05:17.59
ポインタや右辺値・左辺値あたりも結構なハードルだから
決して手続き型が初心者に易しいわけではない
994デフォルトの名無しさん:2012/10/17(水) 00:22:23.75
おまいら次スレ大丈夫ですか
ム板の人は特に無頓着な気がする
995デフォルトの名無しさん:2012/10/17(水) 00:47:21.37
他人任せな奴も多いよね
996デフォルトの名無しさん:2012/10/17(水) 01:01:42.06
初心者の世界では、変数はaからzだけで足りるし再帰もポインタもない
997デフォルトの名無しさん:2012/10/17(水) 03:11:20.71
>>990
日常のなかで宣言的な考え方というのは確かに僅少ですね
最初に出会うのは‥‥数学的帰納法か?
998デフォルトの名無しさん:2012/10/17(水) 03:44:48.81
Little Haskeller キボンヌ
999デフォルトの名無しさん:2012/10/17(水) 08:10:34.89
1000デフォルトの名無しさん:2012/10/17(水) 08:15:46.08
>>999
スレ立て乙
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。