2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

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

1 :デフォルトの名無しさん:2011/03/06(日) 13:32:08.91
haskell.org
ttp://www.haskell.org/

日本語サイト
ttp://www.sampou.org/cgi-bin/haskell.cgi
ttp://www.shido.info/hs/

過去ログ
関数型プログラミング言語Haskell
Part1 ttp://pc.2ch.net/tech/kako/996/996131288.html
Part2 ttp://pc2.2ch.net/test/read.cgi/tech/1013846140/
Part3 ttp://pc8.2ch.net/test/read.cgi/tech/1076418993/
Part4 ttp://pc8.2ch.net/test/read.cgi/tech/1140717775/
Part5 ttp://pc8.2ch.net/test/read.cgi/tech/1149263630/
Part6 ttp://pc11.2ch.net/test/read.cgi/tech/1162902266/
Part7 ttp://pc11.2ch.net/test/read.cgi/tech/1174211797/
Part8 ttp://pc11.2ch.net/test/read.cgi/tech/1193743693/
Part9 ttp://pc11.2ch.net/test/read.cgi/tech/1211010089/
Part10 ttp://pc12.2ch.net/test/read.cgi/tech/1231861873/
Part11 ttp://pc12.2ch.net/test/read.cgi/tech/1252382593/
Part12 ttp://hibari.2ch.net/test/read.cgi/tech/1272536128/
Part13 ttp://hibari.2ch.net/test/read.cgi/tech/1286706874/

2chの仕様により、行頭の半角スペースは表示されません。
コードをインデントしたいときは、代わりに?または全角スペースを使うことができます。

2 :デフォルトの名無しさん:2011/03/06(日) 13:36:32.17
関連書籍
・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

3 :デフォルトの名無しさん:2011/03/06(日) 14:00:18.76
関連リンク
 
・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


こんなもんでどうでしょう

4 :デフォルトの名無しさん:2011/03/06(日) 14:07:15.39
乙です。

ちょろっと追加

ふーぐる
Haskell API search Engine
ttp://www.haskell.org/hoogle/

簡単な使い方

1.検索バーに関数名を入れて検索
 例 map

2.検索バーに型名を入れて検索
 例 (a -> b) -> [a] -> [b]

5 :デフォルトの名無しさん:2011/03/06(日) 14:16:11.35
おぉ、大事なものを忘れてた、ありがと

ところで Hoogle と Hayoo って機能的には同等?
俺は Hoogle の方が発音しやすいから、ずっとこっちを使ってるが

というか、人に勧めるのに「ひゃゆぅ〜」って言うの恥ずかしい

6 :デフォルトの名無しさん:2011/03/06(日) 14:39:20.38
Hayooは初めて知りますた
Hoogle:公式、最新データ
Hayoo:Holumbusプロジェクトの一部で、検索結果に使用例も出る
みたいな感じ?
使ってる人いれば適当にフォローお願いします

7 :デフォルトの名無しさん:2011/03/06(日) 15:00:41.77
>>1,4 乙です。


8 :デフォルトの名無しさん:2011/03/06(日) 15:47:55.87
では諸君、議論をレジュームしたまえ

9 :デフォルトの名無しさん:2011/03/06(日) 15:50:15.35
なんかもう、どーでもよくなってきた

10 :デフォルトの名無しさん:2011/03/06(日) 19:40:40.85
あ、じゃあ
最近気になったので聞いてみる

Haskellって人工知能との相性はどうなんだろ


11 :デフォルトの名無しさん:2011/03/06(日) 19:44:10.99
そういうのは言語に依らないと思うのだが

12 :デフォルトの名無しさん:2011/03/06(日) 20:06:27.56
Haskell との相性というよりは、宣言型言語との相性は良さそうだ
ACM にもその手の論文が結構ある

Haskell Wiki にも記事があって、色んな人が研究してることが分る
http://www.haskell.org/haskellwiki/AI

それほど興味が無いから答えになってなくて悪いが

13 :デフォルトの名無しさん:2011/03/06(日) 20:55:02.42
>>10
論文を書きやすいという意味で、Haskellと人工知能の相性はすこぶる良い

14 :デフォルトの名無しさん:2011/03/06(日) 21:15:40.28
>>11
C言語でAIとかの本も出てたし、本質的にはそうなんだろうけど、人工知能と言えばPrologってイメージが有るじゃ無いですか

>>12-13

ありがとです

何か、詰碁を解くのに向いてるとか聞いたんで、ひょっとして?と思ったんですよね


15 :デフォルトの名無しさん:2011/03/06(日) 22:40:42.53
>>14
> 何か、詰碁を解くのに向いてるとか聞いたんで

これですよね
http://www.shido.info/hs/haskell1.html
http://www.shido.info/hs/haskell12.html

AI のアプローチがどのようなものか知りませんが、
この詰碁を解くプログラムは経路探索ですね

おそらく将棋や碁、オセロなんかの終盤における「読み切り」と同じかと

16 :デフォルトの名無しさん:2011/03/07(月) 21:20:47.98
数値計算のプログラムを作るのが難しいプログラミング言語は、AIに向いているといっておけば間違いない

17 :デフォルトの名無しさん:2011/03/08(火) 01:30:35.02
解候補の集合の生成と探索の制御が楽なのでAIに向いていると言えなくもない
ぶっちゃけ可変配列の書式が楽な言語は全部AIに向いている


18 :デフォルトの名無しさん:2011/03/09(水) 15:04:56.44
sampou.orgにあるContinuationモナドのcallCC関数の定義
callCC f = Cont $ \k -> runCont (f (\a -> Cont $ \_ -> k a)) k
これの最後のkって必ず評価されないと思うんだけど合ってるのかな

19 :デフォルトの名無しさん:2011/03/09(水) 17:34:40.08
そのkってモナドに入ってくる前のcontinuationでしょ?
じゃ最初に評価されるんでないの?

20 :デフォルトの名無しさん:2011/03/09(水) 18:13:08.53
ごめん、評価の問題じゃないね
runCont (f (\a -> Cont $ \_ -> k a))に適用する方のkはCont $ \_ -> k aで捨てられてるから、
それならundefinedに置き換えても問題なく動くんじゃないの、と

21 :デフォルトの名無しさん:2011/03/09(水) 18:21:08.24
あ、callCC $ \exit -> ...でexit呼ばれなかった時の為か

22 :デフォルトの名無しさん:2011/03/09(水) 20:01:07.13
ttp://shootout.alioth.debian.org/index.php
久しぶりに見たら、Haskell、4つのAllのベンチで
どれもCの3倍以内の速度が出てて、
全てOCamlよりも速いんだけど何が起こったの?

23 :デフォルトの名無しさん:2011/03/09(水) 22:14:09.80
>>2
新しい仲間が発売されるらしい。

Learn You a Haskell for Great Good: A Guide for Beginners
ttp://www.amazon.co.jp/exec/obidos/ASIN/1593272839/

webで見られるんだっけ

24 :デフォルトの名無しさん:2011/03/11(金) 11:53:44.71
ttp://haskell.1045720.n5.nabble.com/ANNOUNCE-Haskell-Platform-2011-2-released-tt3424107.html

25 :デフォルトの名無しさん:2011/03/11(金) 22:21:16.22
http://hackage.haskell.org/platform/

なにこの日本人好みなデザイン。俺得。

26 :デフォルトの名無しさん:2011/03/12(土) 00:31:28.41
Haskell Platform がリリースされたと思ったら大地が揺れたでござる

27 :デフォルトの名無しさん:2011/03/12(土) 01:52:03.93
停電でインストール出来ない・・・

28 :デフォルトの名無しさん:2011/03/12(土) 01:57:31.06
>>27
ネットに繋げられるならいつでもハスケれるよ!

http://tryhaskell.org/

明日は冷えるらしいから暖かくして風邪引かない様にね

29 :デフォルトの名無しさん:2011/03/12(土) 18:49:15.12
>>26
-fglasgow-extsを拒否するようになって、大地の神さまが激怒されただよ

30 :デフォルトの名無しさん:2011/03/13(日) 12:06:26.48
諸君、祈祷したまえ

31 :479:2011/03/13(日) 13:55:50.34
>>26,29,30
思わず震災さえもネタにしてしまうのは、
普段から抽象的な思考に努めているHaskeller特有の発想なのだろうか?
それとも自分達は一般人には手の届かない特別なプログラミングをしているという、
潜在的な選民意識の現れなのだろうか?

関西大震災発生直後の現地取材で
「まるで温泉街のようだ」とコメントした某TBSの故アナウンサを憶い出す。
関西大震災で知人が被災した経験のある自分には、
そんなHaskellerの感性が理解できない、理解したくない。

32 :デフォルトの名無しさん:2011/03/13(日) 14:14:22.07
つまらないネタとそれに噛みつく奴は
全部同一人物だと思っている

33 :デフォルトの名無しさん:2011/03/13(日) 14:18:55.98
そういうことにだけは熱心な人たちねw

34 :デフォルトの名無しさん:2011/03/13(日) 14:30:14.25
不謹慎=俺が哀しんでるんだからおまえも哀しめ、空気読め

35 :デフォルトの名無しさん:2011/03/13(日) 14:39:15.12
Haskell Platform 2011.2.0.0(Windows 7)をインストールしたんだが、
ここにパッケージ gtk(gtk2hs)がインストールできない
(パッケージ gtk2hs-buildtools はインストール済み)

cabal gtk と実行すると、cairo のビルドが完了して Registering cairo-0.12.0... の段階で
「setup.exe: internal error: unexpected package db stack: [UserPackageDB]」となる

それでもインストール処理が続く
次に glib のビルドも完了して Registering glib-0.12.0... の段階でまたもや
「setup.exe: internal error: unexpected package db stack: [UserPackageDB]」となる

その後、cabal: Error: some packages failed to install: となり、
cairo と glib で例外が発生して、インストールが未完で終了した

パッケージの説明を見る限りは、ghc 7.0 でも問題ないそうだが、
なにか処理が足らないのだろうか


Haskell Platform 2010.2.0.0 では次の作業手順で gtk がインストールできてたから
全く同じ手順でインストールしてみたのだが

1. http://www.gtk.org/download-windows.html で gtk の All-in-one bundles の 2.16 をダウンロードし、
"c:\" 下に展開し、bin ディレクトリへのパスを環境変数に追加する

2. Haskell Platform フォルダ内の mingw\bin ディレクトリへのパスも環境変数に追加する

3. cabal install gtk2hs-buildtools を実行してから cabal install gtk を実行する

36 :Perl忍者 ◆M5ZWRnXOj6 :2011/03/14(月) 19:21:49.11
最強ハッカーチームPerlBlack「黒真珠」
http://hibari.2ch.net/test/read.cgi/linux/1300097049/


37 :デフォルトの名無しさん:2011/03/15(火) 14:58:12.81
数学的なやつじゃなくてモナドがどのようにコンピューター科学にどう応用されているかみたいな
詳しい本おしえてください。

38 :デフォルトの名無しさん:2011/03/15(火) 15:15:07.85
モナドをコンピュータ科学に利用しているというより、
命令文の実行順を基礎数学だけを用いて表現したモデルがモナド

命令文の順序付き重複集合をモナドで表現したことで、新たに何かが生まれたという話は聞かない

ただ、モナドで表現できたことで論文を大量生産できた

39 :デフォルトの名無しさん:2011/03/15(火) 17:06:18.34
とりあえずこれは見た?
http://www.sampou.org/haskell/a-a-monads/html/

40 :デフォルトの名無しさん:2011/03/15(火) 17:47:03.19
Moggi91の例では集合の圏を使って例外付き計算、副作用を持つ計算を抽象化してるな
で、そこにモナドがあってその性質はうんたらかんたらとかそういう内容
モナドを使えば典型的な計算を綺麗に構成できるって事はまぁそれなりに嬉しい事なんじゃないのかな

41 :デフォルトの名無しさん:2011/03/16(水) 01:00:52.45
モナード

42 :デフォルトの名無しさん:2011/03/16(水) 13:08:25.76
>>39
アーカイブがダウソロードできないのだが(藁

43 :デフォルトの名無しさん:2011/03/16(水) 18:43:10.89
オンラインで見れるからいいじゃないか

44 :デフォルトの名無しさん:2011/03/17(木) 01:33:16.11
>>43
ネットがナローバンドだから…


45 :デフォルトの名無しさん:2011/03/17(木) 17:07:24.74
>>42 nobsun になんとかして、って伝えたら直ると思う

46 :デフォルトの名無しさん:2011/03/20(日) 17:41:09.18
自分でputCharとかのような出力関数を定義するのってどうするんだ?

よそのGUIライブラリのDLLをHaskellで使いたいんだけど、IOが遅延されてこまってる。
createWindowみたいなIO()の関数があっても、
これを出力と認識してないみたいで最後まで実行されないんだ。

47 :デフォルトの名無しさん:2011/03/20(日) 19:57:53.60
遅延させるってのは勘違いで、問題は別にあるんじゃね?
HaskellはIO動作を勝手に遅延したりしないよ

48 :デフォルトの名無しさん:2011/03/20(日) 21:09:20.42
あ、そのとおりだった。
IO(a->b)の(a->b)の副作用のある関数が返ってきてて、その関数を実行してないのが問題だったっぽい。
thx

49 :デフォルトの名無しさん:2011/03/21(月) 07:41:51.33
>>48
> IO(a->b)の(a->b)の副作用のある関数が返ってきてて

それなら、IO (a -> IO b) であるべきなんじゃ…

50 :デフォルトの名無しさん:2011/03/21(月) 11:12:08.27
>>49 ぬぬ、たしかにそうかも。

というかVisualC++で作ったDLLの引数がある関数を呼んだら
Segmentation fault/access violation in generated code
って怒られた。runghcなら通るのに、コンパイルして実行するときだけ……。

51 :49:2011/03/22(火) 05:57:11.86
>>50
どうつまづいているのかよく分からんが、FunPtr や ForeignPtr を使わないといけないのかもしれん。

このへん↓に解説がある:
http://www.haskell.org/ghc/docs/6.8.3/html/libraries/base/Foreign-Ptr.html#t%3AFunPtr


52 :デフォルトの名無しさん:2011/03/22(火) 21:49:40.52
わざわざサンクス。
原因はDLLの関数をHaskellで定義するときに、stdcallにしてたのが原因だった。
ccallにしないと駄目なのね。基準がわからんぜ。
とりあえずDirectXの関数をDLLにエクスポートしてライフゲーム実装するところまではできたから、
あとは何とかなりそう。
猛者たちのスレを汚してすまんね。

53 :デフォルトの名無しさん:2011/03/22(火) 23:12:20.26
network-2.3.0.2 の setSocketOption で RecvTimeOut が設定できません
適当なソケットに
setSocketOption sock RecvTimeOut 1
とすると以下の例外が出ます
*** Exception: setSocketOption: invalid argument (Invalid argument)

ソースを見てみると setSocketOption は ffi で setsockopt を呼んでいるように見えました
setsockopt でタイムアウトを設定する場合は、struct timeval で秒数を指定してポインタを渡す必要があります
しかし、setSocketOption では Int で秒数を指定してポインタを渡しているようでした

エラーの原因は、上記で正しいですか?ffi は初めてなのでほとんど理解できませんでした。
もしそうだとすれば、このバグを報告するとしたらどこが正しいですか?
Maintainer に直接メールするのが正しいですか?バグ登録をする専用のページなどがありますか?

54 :デフォルトの名無しさん:2011/03/23(水) 09:06:17.27
一応 trac に似たような問題
http://trac.haskell.org/network/ticket/23
があがってるから、認識はされていると思うけど、早く対応してもらいたければ
github の issue にあげるのがいいんじゃない?
https://github.com/haskell/network/issues

55 :デフォルトの名無しさん:2011/03/24(木) 08:38:54.64
東京のハスケラーは水道水飲んでる?

56 :デフォルトの名無しさん:2011/03/24(木) 08:58:34.93
飲んでるけど評価遅延させてるから大丈夫

57 :デフォルトの名無しさん:2011/03/24(木) 11:47:03.64
評価しなければ一生大丈夫ってことだな

58 :デフォルトの名無しさん:2011/03/24(木) 12:23:32.95
東京だが、普段から浄水器で浄化した水飲んでるから問題なし。
だいたい基準値の3倍程度の放射能なら一生飲み続けても高々0.07%ガン発生率がアップするだけだし、
浄水器使ってればさらに下がるでしょ。
気にしてる奴の方がストレスが原因で禿げるか死ぬかするw

59 :デフォルトの名無しさん:2011/03/24(木) 12:35:36.01
>>56
数年後、忘れた頃にインフルエンザとかで病院行って尿検査したら、
溜まった分が一気に評価されるぞ

60 :デフォルトの名無しさん:2011/03/24(木) 12:50:13.13
そこで>>56は急性放射線症であぼ〜んw

61 :デフォルトの名無しさん:2011/03/24(木) 12:50:36.16
>>58
どこでそんなデマを…

62 :デフォルトの名無しさん:2011/03/24(木) 16:26:50.33
>>58
浄水器に放射性物質が溜まったら楽しそうね。

63 :デフォルトの名無しさん:2011/03/24(木) 16:45:56.61
0.07%って宝くじで1億円あたる確率より高いよね

64 :デフォルトの名無しさん:2011/03/24(木) 16:49:21.56
>>63
人間死ぬまでに50%の確率で発がんするんだってさ。
50.07%に発がん率がアップしたとして気にするの?

65 :デフォルトの名無しさん:2011/03/24(木) 17:05:48.54
50%ってwwww
1人の母集合を対象に癌になるかならないかというのは確率じゃねーよwww


66 :デフォルトの名無しさん:2011/03/24(木) 17:11:58.50
>>65
一人?
いや、複数だが。

67 :デフォルトの名無しさん:2011/03/24(木) 20:44:46.18
1人でしょうか。
いいえ、複数です。

だろ

68 :デフォルトの名無しさん:2011/03/25(金) 00:15:26.04
浄水器に溜まるならOK。浄水器を抱いて寝るやつはいないんだから。

69 :デフォルトの名無しさん:2011/03/25(金) 03:53:53.96
>>68
ろ過システムは、溜ったヤツがたまにポロって取れて流れてくるから



70 :デフォルトの名無しさん:2011/03/25(金) 07:20:10.39
Haskellの話をしなさい

71 :デフォルトの名無しさん:2011/03/25(金) 07:36:47.61
>>70
遅延評価は、溜ったヤツがたまにポロって取れて流れてくるから

72 :デフォルトの名無しさん:2011/03/25(金) 08:22:56.12
硫黄で腐食した藻などが混入する場合が有りますが副作用はありませんので
どうかご安心ください


73 :デフォルトの名無しさん:2011/03/25(金) 12:42:45.60
こんな Haskell 本あったら読みたい
こんな Haskell 関係の記事があったら読みたい

ってのは何かある?

俺は Arrow を実際のアプリ製作でどう使うのかとか、
あのライブラリではこういう目的でこう使ってる、
みたい解説がある本が読みたい

74 :デフォルトの名無しさん:2011/03/25(金) 13:12:12.43
ところでお前ら、このgif動画は時計回りにみえる?反時計回りに見える?
http://twitpic.com/45946f

75 :デフォルトの名無しさん:2011/03/25(金) 13:25:48.04
>>74
はじめは反時計回りにみえた。
たぶん、時計回りに見えるのが正しいだろうから(理由は省略)、オレの能力には小さな問題があるんだろう。

76 :デフォルトの名無しさん:2011/03/25(金) 13:51:12.49
俺は時計回りにしか見えない、ヤバい

77 :デフォルトの名無しさん:2011/03/25(金) 13:54:33.47
まあ地震関連のデマよりは害が少ないかな

78 :デフォルトの名無しさん:2011/03/25(金) 14:03:04.25
反時計回りに見えるようになった

79 :デフォルトの名無しさん:2011/03/25(金) 14:59:46.19
はじめは時計回りにしか見えなかった。
これで、反時計回りに見えるって、どんな理屈なんだろうと、
画像の差を意識してたら、乳首に気がついて、
乳首が見えるってことは、ブラしてないんだろ?
なんで、揺れないんだ?って不思議に思いながら乳首を見つめていたら、
今度は、反時計回りにしか見えなくなっちゃった。


80 :デフォルトの名無しさん:2011/03/25(金) 17:16:02.72
これいつのネタだよ

81 :デフォルトの名無しさん:2011/03/25(金) 17:20:07.94
haskellでこういう動画作れないですか

82 :デフォルトの名無しさん:2011/03/25(金) 19:23:12.78
作れる

83 :デフォルトの名無しさん:2011/03/25(金) 19:56:14.72
>>74
時計回り・反時計回りどっちもできるようになった!

84 :デフォルトの名無しさん:2011/03/29(火) 11:37:35.60
時計周りにしか見えん…

85 :デフォルトの名無しさん:2011/03/31(木) 17:46:27.57
QuasiQuotesを使って新しい文法を導入したい。
Haskellのリテラルとか式とかdoの中の文とかは既存の文法を基本的に使って、そこに少しだけ新しい文法を入れたい。
そのためには、基本的な構文要素の出来合いのパーサーがあって、それをパーサーコンビネータで組み合わせて使用できればうれしい。

で、探してみると、haskell-src-extsライブラリというのはあったけど、繰り返しとか、選言とかのコンビネータはないよね。
どうすればいい?

haskell-src-extsの上にどうにかしてコンビネータを自分で実装する?
あるいは、基本的なリテラルとかの構文要素もParsecとかでパーサーを作ったほうが早い?
それとも、haskell-src-exts + Parsec みたいなテクニックが存在する?

86 :デフォルトの名無しさん:2011/04/04(月) 10:31:55.61
諸君、議論したまえ

87 :デフォルトの名無しさん:2011/04/04(月) 18:47:50.79
gaeでhaskell使えた

88 :デフォルトの名無しさん:2011/04/05(火) 00:35:16.51
>>87gae て google の?

89 :デフォルトの名無しさん:2011/04/05(火) 16:57:08.58
GUIライブラリは何が良さそうですかね?

90 :デフォルトの名無しさん:2011/04/05(火) 17:57:20.40
>>89
Windowsで動けば良いなら、面倒くさいけど、Win32APIバインディングを直接たたくのが無難。

LinuxではGTKを以前Cで使い込んだことがあるから、Gtk2Hsを試したことがあるけど、最新版のGHCに対応してない時期があって使わなくなった。
もっとも、その後動きがあって、その状況は改善されている、たぶん。
面倒くさくてもよいならX11バインディングを使う道もある。
(他のUnix系も同様のはず)

クロスプラットフォームなら、WxHaskellが良く使われている印象だけど、オレはなじめなかった。
3DCGをやりたいならGLUTもある。

HaskellのGUIライブラリは基本的に他言語のライブラリのバインディングなので、選択基準としては、他の言語で使うときとほとんど同じになるだろう:
1. どのOSで動かしたいか
2. 何をしたいか。ダイアログが一つ表示できればそれでよいのか。統合開発環境みたいな複雑なGUIアプリケーションを作りたいのか。あるいはゲームか。
3. 使ったことがあるか。資料は豊富か(他言語向けの資料でも良い)。

91 :デフォルトの名無しさん:2011/04/05(火) 18:27:44.29
haskellからWPFを叩きたい!

92 :デフォルトの名無しさん:2011/04/05(火) 19:40:30.48
>>91
hs-dotnet (http://hackage.haskell.org/package/hs-dotnet)

これで .NET Framework を叩いてくれ
WPF ではなく普通にウィンドウと適当なボタンを表示して、
何か反応させることはできたが、俺はそこで力尽きた

.NET Framework が叩けるんだから当然 WPF も扱えると思うが、
それで「Haskell から直接叩けた」ことになるのかは知らん

93 :デフォルトの名無しさん:2011/04/05(火) 20:35:43.71
西日本も福島原発の放射能に曝される。

4/7 予測 http://up3.viploader.net/ippan/src/vlippan198234.jpg
発表はドイツ気象庁 http://www.dwd.de/

94 :35:2011/04/06(水) 19:57:54.79
>>35
解決したのでお知らせする

結論から言うと、恐らく gtk-0.12.0 パッケージの作者のミスだと思われるため、
下記の解決方法はバージョンアップで意味を成さなくなると思う(そうなって欲しい)

http://hackage.haskell.org/trac/hackage/ticket/812
このページに載っているとおり、パッケージの tar.gz ファイルを展開し、
中の Gtk2hsSetup.hs ファイルの内容を一部書き換えてから cabal install する

ただし、gtk-0.12.0 に依存し Gtk2hsSetup.hs を持つ全てのパッケージについて、
同様の方法で個別にインストールする必要がある、しかも依存関係の順に

Gtk2hsSetup.hs ファイルを修正すべきパッケージは以下の通り
・gio-0.12.0
・glib-0.12.0
・pango-0.12.0
・cairo-0.12.0
・gtk-0.12.0

他の依存パッケージは普通にネット越しにインストールすればいい

95 :デフォルトの名無しさん:2011/04/06(水) 21:02:18.99
>>94
乙。こういう問題解決の報告って良いよね。

96 :デフォルトの名無しさん:2011/04/07(木) 01:19:05.94
ghc7でqtHaskellをインストールするとエラーすんのでその解決方法。
ぐぐったら出てきたのだけど、StackOverflowの1件のみだったので日本語で書いておく。

build.plはghc7未対応だから諦めて手作業(Manual Installation参照)。

runhaskell Setup.hs buildするとQtc/Core/Attributes.hsが583行目でエラーするので583行目を下記のように書き換える。
reject' = (Qslot "reject()", \_ -> ())

97 :デフォルトの名無しさん:2011/04/10(日) 03:54:27.20
getDirectoryContentsとか、getArgsとかにunicode混じってると化けてしまうのはどうにか出来ませんか?

98 :97:2011/04/10(日) 03:57:40.00
追記:GHC7.0.2
標準入出力の方は問題なく動いています。

99 :デフォルトの名無しさん:2011/04/10(日) 04:14:23.92
大儀であっ

100 :デフォルトの名無しさん:2011/04/10(日) 04:30:37.86
utf8-string
System.Environment.UTF8
Codec.Binary.UTF8.String (decodeString)

101 :デフォルトの名無しさん:2011/04/10(日) 11:34:59.70
>>97
OS環境のロケールと、コマンド引数、ファイル名の符号化が一致していないのではなくって?
そういうことをhaskellプログラム側でごちゃごちゃやるより(できないとは言わない)、OSのセットアップとか、作業パスを見直したほうが良いと思う。

102 :Perl忍者lvl4 ◆M5ZWRnXOj6 :2011/04/10(日) 13:48:13.06
>amachang 今粛々と民事刑事の方面で進めています。一応、すべて証拠として保存しなければいけないので、冗談でも今はこのスレに変なこと書き込まないでください。
>2011/01/28


http://hibari.2ch.net/test/read.cgi/prog/1291518728/

>1 :amachang撲滅振興協議会:2010/12/05(日) 12:12:08
> amachangが憎い・・・・amachangが許せない・・・・

> ククク・・・・クククククク・・・・・
> クックックックックックックッ・・・・・
> クー、クー、クー、クー、クー、クー・・・・・
>
> もう許せない。
> もはや沸き上がる滅意を抑えることが出来ない!!!

103 :デフォルトの名無しさん:2011/04/10(日) 16:27:41.04
>>100
Codec.Binary.UTF8.StringのdecodeStringとencodeStringの2つで解決しました。
ありがとうございました。

>>101
恐らく>>100を前提に書いて下さったと思うのですが、そこにすら至ってませんでした。

104 ::2011/04/11(月) 00:29:18.93
utf8-stringのことは忘れてtextパッケージを使いましょうみたいなのを以前聞いたことがある

105 :デフォルトの名無しさん:2011/04/11(月) 21:14:50.48
http://itpro.nikkeibp.co.jp/article/COLUMN/20060915/248215/?ST=ittrend

毎回ネタが濃くて楽しみにしてるんだけど、更新日守ったのって1月だけだよね
早く次のネタこないかな

106 :デフォルトの名無しさん:2011/04/12(火) 11:27:42.51
hackageを見ても説明が不十分だったり無かったりで、引数や戻り値、名前が抽象的過ぎて何をする関数なのかが分からなかったりする事が多々ある。
みんなどこ見て各パッケージの使い方覚えてるの?

107 :デフォルトの名無しさん:2011/04/12(火) 11:54:15.10
よくわからないものはソースを見る

108 :デフォルトの名無しさん:2011/04/12(火) 12:50:17.23
hackage に載ってる作者のサイトとか見る
ソースも見る

それで分からなかったら、基になってる論文などを漁ってみる

109 :デフォルトの名無しさん:2011/04/12(火) 15:00:24.31
やはりそれしかないのか…
参考になりました。ありがとう。

110 :デフォルトの名無しさん:2011/04/13(水) 16:59:33.20
諸君、議論をレジュームし給え

111 :デフォルトの名無しさん:2011/04/14(木) 04:19:16.44
一々インストールしたパッケージのヘルプ作る為に
haddockするの面倒です
屡々エラーでるし

目的のパッケージが多数の他パッケージに依存していた場合なんて
発狂しそうです

112 :デフォルトの名無しさん:2011/04/14(木) 07:28:39.50
cabal\config ファイル内にある "documentation : True" のコメントを外しておけ
そうすれば cabal install でドキュメントも自動的にインストールされる
(依存パッケージのドキュメントも全て自動でインストールされる)

インストール先も config ファイルで設定できる
デフォルトでは\doc フォルダ内
index.html や doc-index-*.html ファイルらも自動で融合してくれる

113 :デフォルトの名無しさん:2011/04/14(木) 09:37:25.98
ネット繋がってないので
runghc Setup configureからやってるんです
キャバルって確か依存グラフ作って必要なのをダウンロードするんですよね
英語ドキュンメントに確かにhaddockを内部呼び出しするっぽい事書いてありましたが
いずれにせよキャバルは無理だと思います

114 :デフォルトの名無しさん:2011/04/14(木) 12:42:22.48
それなら、必要な依存パッケージは全て手元にあるんだよな

ドキュメントをインストールするのに
依存関係を考慮して順番を気にする必要は無いはずだから、
スクリプトでも書いて自動化させればいいだけだと思うが

Haskell で書いたっていいわけだし

何が問題なんだ?

115 :デフォルトの名無しさん:2011/04/14(木) 12:47:42.54
そういえば、cabal の config ファイルには、
ローカルレポジトリのパスを指定できる項目もある

手元の全依存パッケージをそこにぶち込めば、
"cabal install パッケージ名" でドキュメントも含めて全て
全自動でローカルからインストールされるんじゃないか?

俺は興味ないから詳しくは知らんが、調べてみる価値はあるかも

116 :デフォルトの名無しさん:2011/04/14(木) 13:00:10.67
はいやってみます
有り難うございました

117 :デフォルトの名無しさん:2011/04/14(木) 13:19:05.94
ライブラリの使い方が分からないから論文みるて

118 :デフォルトの名無しさん:2011/04/14(木) 20:08:18.94
昔、Data.Bijection の使い方が分からなくて調べていたら
There and Back Again: Arrows for Invertible Programming
という論文にたどり着いたことはある

まぁ、使い方という言うか、どちらかと言えば意味が知りたかったんだが

119 :デフォルトの名無しさん:2011/04/15(金) 05:09:31.70
統計学パッケージはあるけど
サンプルからヒストグラムを生成してくれるライブラリは無いようですね

120 :デフォルトの名無しさん:2011/04/15(金) 07:19:20.21
標準ライブラリの Data.Array の accumArray がまさにその機能を持つのだが、
そういうことではない?

121 :デフォルトの名無しさん:2011/04/15(金) 17:15:38.50
久しぶりにハスケルを調べたけど、haskell 2010 って仕様ができたんやね。
もう浦島だな。苦笑
ところで
N + K パターン って 再帰とは違うの? 再帰であることの十分条件?

それでアマゾンみてるとcraft3eになって10年以上ぶりに改定されるんやね。

なんかなにもかも浦島です。

122 :デフォルトの名無しさん:2011/04/15(金) 19:07:20.29
>>121
N+K パターンは再帰とは何も関係ない

f (x+1) = x

という関数 f を 4 に適用すれば 3 + 1 の 3 と変数 x が束縛される(x = 3)
ただそれだけの話

正確な意味論は
http://www.haskell.org/onlinereport/exps.html#sect3.17.3
ここの Figure 4 にある case s を見てくれ
意味は分かるだろ

123 :デフォルトの名無しさん:2011/04/15(金) 19:18:26.62
>>122
そうゆうことか。さんくす。

124 :デフォルトの名無しさん:2011/04/15(金) 19:48:23.95
しかし、N+K パターンほど応用範囲の狭い構文糖衣も無いな

125 :デフォルトの名無しさん:2011/04/15(金) 23:39:58.07
failとn+kは抹殺すべき

126 :デフォルトの名無しさん:2011/04/15(金) 23:59:13.44
単相性制限ちゃんは悪くないよ

127 :デフォルトの名無しさん:2011/04/16(土) 00:55:27.91
>>126
Real World Haskell 第6章10節に、望まれても愛されてもいないので、
Haskell標準の次期改訂からは間違いなく外されるでしょうと言わしめた
単相性制限の有用性について詳しく

128 :デフォルトの名無しさん:2011/04/16(土) 05:04:39.85
>>127
x :: Integer
x = 1
と書くより、

x = 1
と書いたほうが短い。



・・・・・・じつは、haskell report 98を読んだが、よく分からなかった。

なんか、
x = let {a = 1} in (a, a)

y :: (Int, Float)
y = x
みたいなコードがかけるとイヤだ、みたいなことが書いてあった。

それと、exportするときに型が決まっていたほうがうれしいでしょ、みたいなことが書いてあって、そりゃコンパイラの最適化はしやすいだろうと思ったが、よく分からん。

129 :デフォルトの名無しさん:2011/04/16(土) 05:12:01.35
なくしたらdecidableじゃなくなると思うんだけど
最近はそれに代わるより扱いやすい制限があるの?

130 :デフォルトの名無しさん:2011/04/16(土) 12:31:55.28
>>129
型が決定できなくなるってこと?
たしかに、単相性制限がなければ、型が決定できなくなるケースは増えるけど、そういった問題がなくなるわけじゃない。

例えば
f s = show $ read s
みたいなコードは単相性制限があろうとなかろうとエラーになる。

そもそも、型の不一致でエラーがでないようにするためには最も一般的な多相型が推論できればそれでよいのであり、またそのような型を推論してくれほうが便利・
そして、単相性制限があると、かえって最も一般的な多相型を推論することを妨害する。

131 :デフォルトの名無しさん:2011/04/16(土) 13:47:29.30
単相性制限はHaskellで一番荒れる話題

132 :デフォルトの名無しさん:2011/04/16(土) 19:12:55.65
そんな話題で熱く論争できるとは…レベル高っ

133 :デフォルトの名無しさん:2011/04/16(土) 19:19:23.66
xmonadの設定ファイルの読み方を聞こうとしたものの
あまりにレベルが違いすぎて何度も書き込みをキャンセルした漏れが
泣きながら通りすぎます。

134 :デフォルトの名無しさん:2011/04/16(土) 22:21:30.61
ここは初心者歓迎だよ。そもそもHaskellスレは一個しかないし

135 :デフォルトの名無しさん:2011/04/17(日) 00:13:43.75
>>134
http://mainichi.jp/select/today/news/images/20110417k0000m030039000p_size5.jpg

136 :デフォルトの名無しさん:2011/04/17(日) 09:16:39.74
俺は形式意味論研究してる立場だからhaskell使ってくれる奴が増えるのは大歓迎。
俺の考え方を押し付ける相手がいないと困るからな。

137 :デフォルトの名無しさん:2011/04/17(日) 10:00:49.14
Haskellの形式意味論は公式にあったっけ?

どうでもいいが、ときどき論文に出てくるサブセットの意味論は
操作意味論 + 表示意味論で、余り純粋ではないね。
男なら表示意味論で非同期例外やI/Oも込みで押し通すべき。

138 :デフォルトの名無しさん:2011/04/17(日) 10:26:58.64
非公式なら少しある

公式にはない
ない理由が「言語設計者たちが考えること」って本に書かれてたと思う

139 :デフォルトの名無しさん:2011/04/17(日) 10:54:07.65
Standard ML以下か…

140 :デフォルトの名無しさん:2011/04/17(日) 11:05:55.63
言語設計者たち〜にはできなかった言い訳が書いてあったように覚えてる

141 :デフォルトの名無しさん:2011/04/17(日) 11:43:40.03
形式意味論が完全でない、あるいはドキュメント化されていない理由は、
>>3 にある "A History of Haskell" にも書かれている

3.4 Haskell has no formal semantics

要するに、急を要する仕事ではなかったし、
それでユーザーも実装者も何とかやっていけるだろうし
そもそもユーザーにとっては型チェックが通れば意味論なんてどうでもいいだろ

それに意味論を完全に定義しちゃうと、
新機能を追加したりシェイプアップするのにかなり時間がかかる
いちいち新たに意味論を考えて既存のものとの整合性を考慮しなきゃならないからね
意味論の完全性を過剰に求めるのは、むしろ言語の進化を阻害するんだよ

とのこと

>>139
100% 完全に意味論が定義された Standard ML に比べれば、
意味論の定義の完全性という点では、理論的には全言語が Standard ML 以下だ

142 :デフォルトの名無しさん:2011/04/19(火) 06:10:30.28
HaskellのGCはどれくらい最先端なのですか?

143 :デフォルトの名無しさん:2011/04/19(火) 06:13:01.82
>>131
Emacs と Vim どっち好き?

144 :デフォルトの名無しさん:2011/04/20(水) 16:19:47.61
そういやleksahの話題って出ないね

145 :デフォルトの名無しさん:2011/04/20(水) 19:13:14.58
leksahとmanateeはyi以上にオワコン

146 :デフォルトの名無しさん:2011/04/21(木) 19:19:07.82
yiっていーの?

147 :デフォルトの名無しさん:2011/04/21(木) 21:30:15.72
Vimライクでない開発環境は使う気がしない
矢印キーで移動とかやってられんわ

148 :デフォルトの名無しさん:2011/04/22(金) 07:06:29.18
Emacsだって矢印キー使わずとも移動できるよ
まあ例によってctrlだからvi派には合わんだろうが

149 :デフォルトの名無しさん:2011/04/22(金) 14:52:39.39
宗教論争ktkr


150 :デフォルトの名無しさん:2011/04/22(金) 16:44:10.72
自宅のDHCP鯖のログを見ると知らないMACアドレスが30個も接続された形跡がある。

151 :デフォルトの名無しさん:2011/04/22(金) 19:06:28.68
>>147
Vimのエミュレーションモードあるみたいだよ。
Features:
Emacs, Vim and Cua (subset) emulations provided by default

152 :デフォルトの名無しさん:2011/04/22(金) 22:23:30.43
数値計算やってるんですけど、デカい行列を次々に更新していくんですけど、
そのときに、行列の100万くらいある要素のごく一部だけを更新するんです

これってもしかして、行列を更新するたびに、いちいち100万くらいの要素全部をコピーし直さなくちゃいけないんでしょうか?

153 :デフォルトの名無しさん:2011/04/22(金) 23:59:43.83
>>152
PreludeにもインポートされているData.ArrayのArrayを使っているなら、基本的にはそうでしょ。
ただ、「行列を更新するたびに」の「行列を更新」のタイミングは、遅延評価がかかっているとは思うけど。

対応方法としては
・IOモナド、Stateモナドの破壊的更新のできる配列を使う - 手続き的になるのが良いのか悪いのか。更新の回数は完全に制御できる
・配列ではなくData.Map(平衡二分探索木…のはず)を使う - 100万もの要素を扱うのはどうなんだろうという気がするけど、プログラミングとしては楽だと思う
・私は使ったことないけど、これ→http://itpro.nikkeibp.co.jp/article/COLUMN/20101013/352848/?ST=ittrend ただ、いつ最適化されるのか読みきるのはHaskellへの慣れが相当いりそう

ところで、その100万くらい要素がある行列って、もっと小さなブロックに分解できないものなの?
1000 * 1000の「配列 のリスト」にするだけでも相当変わると思うんだけど。

154 :デフォルトの名無しさん:2011/04/23(土) 00:37:20.46
STArrayとかSTUArrayとか使いなされ

155 :デフォルトの名無しさん:2011/04/23(土) 00:39:34.41
>>153
1000×1000の行列で、対角線に沿って要素に非ゼロの数字が入ってて、対角線から離れるとほとんど要素は0
で、ノイズとしてところどころ(1000個くらい)に非ゼロの数値が入ってる
どの要素にノイズが乗るかは、まるで決まっていない
計算するときには、対角線を中心に1000〜5000個の要素だけがコロコロ更新される
ノイズ部分は絶対値が0に近づく方向にだけ更新される
要素が0のところは絶対に更新されない

やっぱり破壊的更新しないとダメですかね…

156 :デフォルトの名無しさん:2011/04/23(土) 00:46:40.10
>>154
よく分かってないんですけど、STArray って、破壊的更新してるんじゃないんですよね?

157 :デフォルトの名無しさん:2011/04/23(土) 00:50:37.27
してるよ
Haskellでもmutableな配列はIOに汚染させずに使える
STモナドを調べておくれ

158 :デフォルトの名無しさん:2011/04/23(土) 04:48:55.48
>>155
それならリストでもMapでもいけると思う。
だって、リストなりMapに存在しないデータをゼロとみなせば、実際に保持しておく必要のあるデータは千のオーダーなんでしょ。
Data.MapのfindWithDefaultとinsertで楽勝じゃね?

159 :デフォルトの名無しさん:2011/04/23(土) 14:29:47.66
>>158
プログラムを書くときにはどの位置の要素にゼロじゃないデータが入るかわからないけど、上手にできますかね

160 :デフォルトの名無しさん:2011/04/23(土) 16:18:28.95
>>159
0じゃない要素だけ値と座標を持てばいいんじゃない?
んでmapやhashを使えば要素数が増えても参照時間はそんな伸びないし。
残りは仮想的に扱えばいいように思える。

161 :デフォルトの名無しさん:2011/04/23(土) 16:31:28.92
>>159
Data.MapのMapを前提に。

コードとしては、Data.MapのMapはkeyとvalueのペアの辞書だから、座標(Int, Int)をkeyにして、0でないデータを追加していけば良いだけ。
keyはこんなんで良かろう。
(compareをうまく定義すれば対角線に近いほど木のrootに近くできなくはないと思うけど、現実的な方法が思いつかなかった)

data Cord = Cord {-# UNPACK #-} !Int {-# UNPACK #-} !Int
 deriving (Show, Eq)
instance Ord Cord where
 compare (Cord ax ay) (Cord bx by) = compare ax bx `mappend` compare ay by

「上手に」というのはパフォーマンスの話なら、ちょっとむずかしい。
空間的には、100万要素の配列よりも、千〜万の二本木のほうが小さいだろう。
速度的には、やっぱり100万要素の配列を破壊的に更新したほうが早いだろうな。

最初のデータを全部入れて木を構築するのにちょっと時間がかかるはずだけど、それは最初の一回だけだし、千から一万のデータなら気にするほどのことではなかろうと思う。
また、最初の木を構築するときに0のデータは入れないとして、データを更新するときに0にしたものを削除するかどうかはちょっと悩む。
0のデータがある程度たまってから一気に木を再構築するのが良さそうに思えるけど、よく分からん。
アプリケーションにもよると思う。更新より参照のほうがはるかに回数が多いなら、こまめに0のデータを削除したほうが良いはず。

162 :デフォルトの名無しさん:2011/04/23(土) 16:55:42.08
ガウスの消去法でさえも、どうやればいいのかちょっと悩んでしまう。
Haskellってコードの作成コストと保守コストは低いかもしれんが、プログラマを養成するコストがとんでもないことにならないか?

163 :デフォルトの名無しさん:2011/04/23(土) 17:05:00.33
エントロピーって言葉を知っているかい?
Haskellで得られる生産性の高さはHaskellを学ぶ労力と釣り合わないってことさ

164 :デフォルトの名無しさん:2011/04/23(土) 17:14:18.16
新卒プログラマをデスマーチに投入することで生まれる
希望から絶望への相転移エネルギーを回収することで宇宙のエントロピーは減少するのさ。

165 :デフォルトの名無しさん:2011/04/23(土) 17:27:26.61
何言ってるのかよくわからないからりりかSOSで例えてくれ

166 :デフォルトの名無しさん:2011/04/23(土) 21:59:09.73
死屍累々たる新卒を糧にして命の花は咲くということさ。

167 :デフォルトの名無しさん:2011/04/23(土) 22:12:59.71
おまいら・・・

168 :デフォルトの名無しさん:2011/04/23(土) 22:40:36.42
>>162
この手の問題は、IOモナドやSTモナドで配列の破壊的更新をしてしまうという解は常にあるわけで、「Haskellらしさ」にこだわらなければ他の言語よりむずかしいということはないと思う。
モナドって何さ? というのはたしかに説明するのが難しいけど、そこはまぁ、LISPとかと同じように「変数に値をバインドしている」と考えることにすればいいわけで。
「変数に値をバインド」というのは何さ? 変数って値を入れておく箱じゃないの? といわれたら、これまた面倒だが、そこまでBASIC時代の人は無視しても良いと…

破壊的更新はHaskellらしくないと嫌う風潮があるけど、状態モナドを使ったほうが自然なアルゴリズム、破壊的更新のほうが理解しやすいプログラムというのはありえ、そういうときに破壊的更新を躊躇するのはむしろ良くないことだと思う。

169 :デフォルトの名無しさん:2011/04/23(土) 23:20:42.81
アルゴリズムはその解法を実際に表現し行うシステム
(プログラミング言語や人の思考)あってのものなので

破壊的更新をする手続き的なプログラムの方が表現しやすい、だから、
破壊的更新をするアルゴリズムを採用する

破壊的更新をしない宣言的なプログラムの方が表現しやすい、だから、
破壊的更新をしないアルゴリズムを採用する

というのが本来目指す姿であって、まずはこのように考える
当然その時の自分の能力によっては、そんなに上手く行かないかもしれない
しかし、解きたい問題の本質を考えて数式で表現できれば、
破壊的更新をしないアルゴリズムを見つけやすくなる
この辺りは「Pearls of Functional Algorithm Design」で大いに学べる

もしどうしても破壊的更新をしなければならなくなった場合でも、
Haskell は逐次的にちまちまと更新するのは苦手だが、
一気に更新するのはメモリ効率的にも速度的にも記述的にもそれほど問題ない
それをするためにもできるだけ宣言的なプログラムを目指すのは意味がある

>>152 は何となく初めに破壊的更新をするアルゴリズムを採用し、
それを Haskell でどう表現しようかと、本来とは逆の思考をしているように感じる
例えば手続き型を対象とした数値計算の解説書の方法を Haskell に移植するとか

既に破壊的更新をしないアルゴリズムについて考えた後であれば余計なお世話であった

170 :デフォルトの名無しさん:2011/04/23(土) 23:41:54.16
スピードを考えないなら手続き的な更新による手法の大半は
全体を丸ごと置き換えることだけ考えてれば楽ちんなんだがな

171 :デフォルトの名無しさん:2011/04/23(土) 23:44:57.27
難しいことを考えなくても手続き的アルゴリズムをSTUArrayで素直に実装するだけでいいのに

172 :デフォルトの名無しさん:2011/04/23(土) 23:48:33.61
UArrayすら殆ど知られてないのに、STUArrayが周知されるのはいったい何年後やら…

173 :デフォルトの名無しさん:2011/04/23(土) 23:54:51.84
難しいことを考えずに素直にJavaで実装すればおk

174 :デフォルトの名無しさん:2011/04/24(日) 00:02:52.80
Haskell as a better Java

175 :デフォルトの名無しさん:2011/04/24(日) 00:35:55.98
>170
F#への新参者だが丸ごと書き換えるのはいろいろと楽でいいねぇ。
大方の場合、パフォーマンスでも問題ないし。

176 :デフォルトの名無しさん:2011/04/24(日) 07:11:17.72
> エントロピーって言葉を知っているかい?
エントロピーって単語を使ってみたかっただけだよな?
頼むからそうだと言ってくれ


177 :デフォルトの名無しさん:2011/04/24(日) 10:11:39.70
>>176
魔法少女まどか☆マギカって知ってるかい?

178 :デフォルトの名無しさん:2011/04/24(日) 10:52:49.22
最近のアニメって浅い知識で専門用語使いたがるね。正直萎えるわ

179 :デフォルトの名無しさん:2011/04/24(日) 10:55:28.58
そんな事言ったらこの世からSFがすべて無くなるぞw

180 :デフォルトの名無しさん:2011/04/24(日) 11:02:28.28
関数型言語と気軽にいうが、言葉の意味をきちんと説明できる人
が皆無なのと同じことだ

181 :デフォルトの名無しさん:2011/04/24(日) 11:10:04.05
アニメを含む娯楽作品は、作者の思いが込められたりはするが、
それを深読みしたり現実の世界と繋げたりすることは二の次で、
まずは純粋に楽しめよ

Haskellも関数型とかモナドとかはとりあえず二の次で、
まずは純粋に楽しめよ

182 :デフォルトの名無しさん:2011/04/24(日) 11:28:14.57
楽しむよりもビジネスにするのが大事だと思うが。

183 :デフォルトの名無しさん:2011/04/24(日) 11:37:48.10
ビジネスとか言ってる奴笑えるw

184 :デフォルトの名無しさん:2011/04/24(日) 11:56:54.31
>>182
それも大いに大事だが、そちらはお前ががんばってくれ

おれは純粋に楽しむ

185 :デフォルトの名無しさん:2011/04/24(日) 11:58:31.29
>>178
本格SFでさえ専門家から見ればプププなんじゃないの?


食らえ!アローモナド!

くくく……単相性制限下においてそのようなコンパイルなど通らぬわっ!


しまった!チュドーン……

くらいいい加減なものじゃないか
小説の専門用語なんて

186 :デフォルトの名無しさん:2011/04/24(日) 12:07:15.74
関数型言語の基本はなにより楽しむことだからな
だってふぁn

187 :デフォルトの名無しさん:2011/04/24(日) 12:31:55.84
楽しくプログラミングできる
→プログラマの創造性が生かされる
→良いプログラムが出来上がる
→顧客増える
→ビジネス成功

188 :デフォルトの名無しさん:2011/04/24(日) 12:32:40.68
fun of programmingっていうタイトルにはそういう意図があると聞いたことがある

189 :デフォルトの名無しさん:2011/04/24(日) 12:42:43.02
>>188
当たり前みたいだし短いけど、中身もあっていいタイトルだよな

190 :デフォルトの名無しさん:2011/04/24(日) 12:51:28.37
関数型言語がもてはやされる理由に自動プログラミング(笑)への展望がある

191 :デフォルトの名無しさん:2011/04/24(日) 13:05:08.30
>>190
初めて聞いた

192 :デフォルトの名無しさん:2011/04/24(日) 13:07:03.21
並列化への親和性の高さも一つの理由だけどね。

193 :デフォルトの名無しさん:2011/04/24(日) 13:12:10.67
自動プログラミングというか形式的手法?
coqとかagdaみたいな定理証明系を利用して高い信頼性を持ったコードを書くとかそういうやつかw

194 :デフォルトの名無しさん:2011/04/24(日) 13:23:48.44
急に書き込みが増えたけど、規制解除されたのか?

195 :デフォルトの名無しさん:2011/04/24(日) 13:35:56.95
俺がネット再開できて興奮してるだけ

196 :デフォルトの名無しさん:2011/04/24(日) 13:39:30.19
震災で鬱にならないためには楽しんだ方がいいってホンマでっかTVで言ってた。

197 :デフォルトの名無しさん:2011/04/24(日) 14:23:38.92
Haskell プログラミングのおかげで就職できる場所は大学だけだと思う

198 :デフォルトの名無しさん:2011/04/24(日) 14:33:02.82
Haskellプログラミングをしている人はHaskellの構文やライブラリだけに詳しいわけじゃない。
就職できるとかできないなんて低レベルな話にも興味がない。

199 :デフォルトの名無しさん:2011/04/24(日) 14:42:47.01
関数型言語を仕事で直接に使うことは少ない(若しくは無い)が、
関数型言語の知識を知っていると良いコードを書けるから仕事で役に立つというのはあると思う

200 :デフォルトの名無しさん:2011/04/24(日) 14:57:47.71
>>198
ハスケラー=社会性0の人ということで馬鹿にしてんのか?

201 :デフォルトの名無しさん:2011/04/24(日) 15:03:33.24
>199
F#だがバリバリ製品コードで使ってるぞ(´・ω・`)

202 :デフォルトの名無しさん:2011/04/24(日) 15:08:43.91
現場で一番動いてるのプログラムのソースはアセンブラ
次がC言語
次がJava
次がC++
だいぶ離れて次がBasic

203 :デフォルトの名無しさん:2011/04/24(日) 15:12:15.61
>>200
Simon Thompsonが書いたErlang本を読んだ

filterやreverseを自分で実装させるあたり
教育的配慮に富んだ本だなと思って読み進めていたところ
3章の練習問題がコンパイラ作成で悶絶した

Haskellerというのは社会性がないというか
手加減を知らない人たちなんだろうな。そう思った

204 :デフォルトの名無しさん:2011/04/24(日) 15:30:08.39
関数型言語やってる
=計算機科学はもちろんのこと、数理論理学や情報理論などの基礎理論にも通じている
=技術を使うだけではなく技術を生み出すことにも長けている
=イノベーティブな技術を展開し常に業界を牽引していく人材

205 :デフォルトの名無しさん:2011/04/24(日) 15:41:42.60
計算機科学と情報理論に通じてなくてもなんとかなるのが関数型言語
むしろ、計算機科学と情報理論に通じてる人にはHaskellは難しい

206 :デフォルトの名無しさん:2011/04/24(日) 15:57:25.90
>>205
もっと詳しく聞かせてくれ

207 :デフォルトの名無しさん:2011/04/24(日) 16:08:57.92
>>206
ハードウェア→アセンブラ→C・Java→Haskell のルートよりも、
論理学→基礎数学→Haskell のルートの方が楽

208 :デフォルトの名無しさん:2011/04/24(日) 16:33:35.20
>>207
明らかに前者のほうが敷居が低い。
中卒・高卒でもなんとかなるレベル。

後者は数学的センスが無いと無理。

209 :デフォルトの名無しさん:2011/04/24(日) 16:34:39.63
>>205
「使うだけならね」w

210 :デフォルトの名無しさん:2011/04/24(日) 16:35:37.96
>>203
> filterやreverseを自分で実装させるあたり
> 教育的配慮に富んだ本だなと思って読み進めていたところ
> 3章の練習問題がコンパイラ作成で悶絶した

ワロタ
RWHで基礎が終わったな、というところで出てきた実践トピックが画像認識だったところで、オレもあせった

211 :デフォルトの名無しさん:2011/04/24(日) 16:39:11.57
>>208
メモリアドレスとか、レジスタとか、スタックとかを抽象化せずに、ああやって、こうやって、こうやればやりたいことができるというパズルを解くのは、それはそれで一種のセンスがいると思う…
たぶん世間のほとんどの人はそういうパズルはとけない。

212 :デフォルトの名無しさん:2011/04/24(日) 16:52:36.66
で、結局Haskell製の有名なソフトウェアはあるのかね?

213 :デフォルトの名無しさん:2011/04/24(日) 16:54:14.65
>>212
GHC

214 :デフォルトの名無しさん:2011/04/24(日) 16:54:17.93
>>211
そういう経験は中学・高校で済ませた。
高校時代はZ80で制御するマイクロマウスで大会にも出場したし、
あるゲーム雑誌にも自作のゲームを投稿したりした。
知識基盤がいらないテクニックだけなら中高生でも簡単に習得できるんだよ。
テクノロジーとテクニックは違う。
テクノロジーは知識の蓄積が必要で他人に伝えることもできるが、
テクニックは個人の修練でしかない。

大学では物理学を学び、大学院では計算機科学と整数論を学んだ。
大学時代はスパコンでシミュレーションプログラミングをしたし、
院卒後ある人工衛星のプロジェクトにも参加してプログラムを担当したが、
主に物理と数学の知識が役に立った。

215 :デフォルトの名無しさん:2011/04/24(日) 16:56:24.99
>>212
Haskellは論文を書くための言語

216 :デフォルトの名無しさん:2011/04/24(日) 17:49:23.83
>>215
論文を書くためにHaskellを使った例(タイトル)をいくつか挙げてくれ

217 :デフォルトの名無しさん:2011/04/24(日) 17:55:16.51
>>216
http://arxiv.org/find/all/1/ti:+Haskell/0/1/0/all/0/1
http://arxiv.org/find/all/1/abs:+Haskell/0/1/0/all/0/1

218 :デフォルトの名無しさん:2011/04/24(日) 18:07:02.26
それは論文を書くためにHaskellを使ったんじゃなくて、
研究のためにHaskellを利用したんだよ

Haskellを手段として行った目的は論文を書くことじゃなくて、研究だよ

>>215 は論文を書くのが目的、その手段がHaskellだと
実に馬鹿なこと考えてるんだよ

219 :デフォルトの名無しさん:2011/04/24(日) 18:16:11.12
>>218
大学の研究者にとっては論文を書くのが目的
研究は論文を書くための手段でしかない(研究しない方が論文を書けるなら研究なんかしない)
Haskellはその研究の手段でしかない

研究業績とは研究への熱意じゃなくて論文の数

220 :デフォルトの名無しさん:2011/04/24(日) 18:27:57.55
お前ら、大学生みたいな幼稚な会話ばっかりすんなよ

221 :デフォルトの名無しさん:2011/04/24(日) 19:02:34.79
>>219
その域を超えられないなんて可哀想

222 :デフォルトの名無しさん:2011/04/24(日) 19:10:48.26
俺もその域越えたい
その域を越えられたらもう論文書かなくてもいいのかな・・・

223 :デフォルトの名無しさん:2011/04/24(日) 19:41:42.85
論文書かなきゃ生活が成り立たないという話が好きな人が多いな。

224 :デフォルトの名無しさん:2011/04/24(日) 19:41:47.54
好きで研究すれば公開したくなる、書きたくなる

昔、先生が言ってた

225 :デフォルトの名無しさん:2011/04/24(日) 20:00:30.30
どうせ学生だろ、お前ら。
学生なら論文とかくだらないこと考えてないでもっと面白いことかんがえろ。

226 :デフォルトの名無しさん:2011/04/24(日) 20:42:08.41
>>150
ごめん

227 :デフォルトの名無しさん:2011/04/24(日) 20:53:38.09
>>217
二つ目のリストにある「Yacc is dead」というタイトルがカッコ良すぎるんだが。
中の「Cargo cult parsing」という言い回しもカッコいい。

228 :デフォルトの名無しさん:2011/04/24(日) 21:02:55.14
論文は数だよ兄貴

229 :デフォルトの名無しさん:2011/04/24(日) 21:19:50.24
こりゃ研究機関も仕分けだな

230 :デフォルトの名無しさん:2011/04/24(日) 21:39:24.65
>>203
なんと言うか、関数型言語の本って出せる機会が少ないからなのか、入門書なのに入門書の域を越えて詰め込もうとする傾向は有るな

ちゃんと入門者向けの本、中級者向けの本、上級者向けの本って別れたら、むしろ手続き型言語より分かりやすいのに


231 :デフォルトの名無しさん:2011/04/24(日) 21:42:50.27
>>207
無駄が大杉

c・java -> haskell
算数 -> haskell

で十分

んで、後者の方が楽

haskellなんぞ、算数の知識があれば十分理解出来る


232 :デフォルトの名無しさん:2011/04/24(日) 21:43:16.70
カネをぶんどれる論文がいいよ。

233 :デフォルトの名無しさん:2011/04/24(日) 21:53:20.70
>>231
Haskellを覚えるのが目的だなんて、貧相な奴だな。

234 :デフォルトの名無しさん:2011/04/24(日) 21:58:15.47
>>233
他の知識はhaskell使える様になってから覚えれば良いだろ
初心者に知識の詰め込みを強要し過ぎ


235 :デフォルトの名無しさん:2011/04/24(日) 22:01:03.84
あらいぐま haskell

236 :デフォルトの名無しさん:2011/04/24(日) 22:04:47.62
ファイナルfunだしー
 ある日世界中に散らばってしまったクリスOkasakiの知識を集めながら、ジョブを得(ry

237 :デフォルトの名無しさん:2011/04/24(日) 22:52:14.20
>>235
そういうの、あたしは嫌いじゃないな
誰か あらいぐまハスケルたん 描いて

238 :デフォルトの名無しさん:2011/04/25(月) 06:57:45.67
このスレ女が居るのか

239 :デフォルトの名無しさん:2011/04/25(月) 07:12:03.42
んなわけないだろ

240 :デフォルトの名無しさん:2011/04/25(月) 08:49:18.18
そうか気のせいか

241 :デフォルトの名無しさん:2011/04/25(月) 09:43:17.41
女ですがなにか

242 :デフォルトの名無しさん:2011/04/25(月) 09:58:54.35
このスレ女が居るのか

243 :デフォルトの名無しさん:2011/04/25(月) 12:48:28.06
Haskellと2chをやっている女なんて、アレだろ。

学校の成績はほどほどだけど妙に偏った知識があって、メガネで、ぼさぼさの頭でTシャツの上にカーディガンでキャンパスにくる。
合コンでは、一人でウーロンハイを飲んでいて、声をかけたら「いや、楽しんでますよ」とか曖昧な笑顔をする。

オレの嫁にしてやる。

244 :デフォルトの名無しさん:2011/04/25(月) 13:12:21.90
性同一性障害の女でもない限り、haskellに興味なんか持たんよ

245 :デフォルトの名無しさん:2011/04/25(月) 13:19:51.14
haskellは道具であって目的ではないからな。
haskellを目的と勘違いしているやつがこのスレには多そうだが
女は道具としてなら使うだろう。

246 :デフォルトの名無しさん:2011/04/25(月) 13:24:43.55
flipって遅くなるの?
それとも最適化かかる?

247 :デフォルトの名無しさん:2011/04/25(月) 13:33:06.99
haskellを使ってwebサイト作ってみたいんだけど、参考になる書籍とかサイトってある?
何のライブラリを使ってとか全然分からん

248 :デフォルトの名無しさん:2011/04/25(月) 13:46:20.79
>>246
{- scrach.hs -}
module Srach (x, y) where
x = flip (+) 10 20
y = (+) 100 200

この単純なコードを ghc -O2 -fforce-recomp -ddump-simpl scrach.hs してみた(かなり要約):

Srach.y2 = GHC.Integer.Type.S# 100
Srach.y1 = GHC.Integer.Type.S# 200
Srach.y = GHC.Integer.plusInteger Srach.y2 Srach.y1

Srach.x2 = GHC.Integer.Type.S# 20
Srach.x1 = GHC.Integer.Type.S# 10
Srach.x = GHC.Integer.plusInteger Srach.x2 Srach.x1

この例では、最適化されると分かる。

249 :デフォルトの名無しさん:2011/04/25(月) 14:10:53.57
>>248
なるほど、つまり単純なケースでは最適化かかるみたいだけど
複雑なケースではわからないから
結局の所実測してみて使うか決めるしかないんだ
一々下らない事訊くんじゃないこのうすのろ
って事ですね有り難うございました(´・ω・`)

250 :デフォルトの名無しさん:2011/04/25(月) 14:11:38.13
>>247
haskell http server でググれば?


…方向性として三つあると思う。

一つ目。
UNIXのSocket(あるいはWindowsのWinSoketだっけ?)プログラミングをすでにCで習得しているなら、ちょっとした実験は、そのAPIのHaskellバインディングを使うのが簡単だろうな。
簡単なWebクライアント・プログラムを書いたことがあるが、それの動作確認・デバックのためのサーバースタブ側はこれで作った。

二つ目。
サーバーはApacheかなんかを動かして、ghcであらかじめ用意しておいた実行形式ファイルをキックする。
これも試したことある。
個人サイトでちょっと試してみたいなら、たぶん、一番簡単。
runghcをキックするスクリプトを書いて、Apacheからはそれをキックするようにすれば、事前のコンパイルも必要なかろう。

三つ目。
なんらかのフレームワークを使う。
http://www.haskell.org/haskellwiki/Web/Frameworks
オレはどれも試したことない。

251 :デフォルトの名無しさん:2011/04/25(月) 14:22:45.67
なんかイライラするな。
空気めないやつってよくいわれない?

252 :デフォルトの名無しさん:2011/04/25(月) 14:40:50.64
はい すいません Perl忍者が最近煽りに来ないので
代わりに僕がと思いまして

253 :デフォルトの名無しさん:2011/04/25(月) 16:30:52.53
>>250
ありがとう
runghcが使えるってのは便利だね
apacheからキックする方法で試してみる

254 :デフォルトの名無しさん:2011/04/27(水) 10:44:17.46
Allow教えて

255 :デフォルトの名無しさん:2011/04/27(水) 11:15:10.70
型を見てかんがえろ

256 :デフォルトの名無しさん:2011/04/27(水) 11:21:28.49
意地悪><

257 :デフォルトの名無しさん:2011/04/27(水) 11:23:25.59
てかArrowの話は過去ログでさんざん語られたはずだろ。

258 :デフォルトの名無しさん:2011/04/27(水) 12:13:04.96
何だこのArrow!&&&か?

259 :デフォルトの名無しさん:2011/04/27(水) 12:42:46.42
>>254
Allow じゃなくて Arrow な

Arrow の何が知りたいのか具体的に聞いてくれ

260 :デフォルトの名無しさん:2011/04/27(水) 12:44:46.87
Arrowは車輪の再発明なの?

261 :デフォルトの名無しさん:2011/04/27(水) 12:45:40.83
車輪の再発明の意味を調べてからもう一度おいで

262 :デフォルトの名無しさん:2011/04/27(水) 12:47:03.67
>>260
Arrowと同じアイデアをArrow登場以前にHaskellで実装されていたのなら教えてくれ

263 :デフォルトの名無しさん:2011/04/27(水) 12:50:27.82
自分の書いたコードが正格か非正格か判定する指針について教えて下さい

264 :デフォルトの名無しさん:2011/04/27(水) 12:53:54.32
Arrowは構造化プログラミングに関しては副産物として再発明したに過ぎないの?
真の用途は?

265 :デフォルトの名無しさん:2011/04/27(水) 13:00:37.11
単射とか全単射とかあるだろ。それだよ。

266 :デフォルトの名無しさん:2011/04/27(水) 13:04:46.68
(´・ω・`)はい

267 :デフォルトの名無しさん:2011/04/27(水) 14:01:28.24
射って翻訳するけど矢の方が的を射ているよ。
関数 f :S→Tの矢印が矢のように見えるだろ。
この矢の一般化が圏論と言われているのだよ。
別名アーチェリーともいう。

268 :デフォルトの名無しさん:2011/04/27(水) 14:08:17.35
的を得る、な。

269 :デフォルトの名無しさん:2011/04/27(水) 14:15:23.47
>>268
:(;゙゚'ω゚'):マジで?

270 :デフォルトの名無しさん:2011/04/27(水) 14:28:19.23
アーチャリー

271 :デフォルトの名無しさん:2011/04/27(水) 15:48:11.88
>>268
その親父ギャグはつまんない。親父ギャグって脳の老化なんだってよ。

272 :デフォルトの名無しさん:2011/04/27(水) 15:53:54.16
>>268
それマジで言ったん?ソースあんならすぐ出せ
マジなら2ちゃんねら総力上げて書き直すが

273 :デフォルトの名無しさん:2011/04/27(水) 15:56:07.78
軍事:作戦指揮・統帥
法学&司法:作戦参謀
馴れ合い:兵隊召集&前線指揮
少年犯罪:少年法を盾に活動
無職・だめ:鉄砲玉要員
野鳥観察:見張り要員
vip:祭り要員
モ娘(狼):ストーキング
河川・ダム:水攻め
園芸:穴掘り要員
車・バイク:交通、特攻
オカルト:儀式
PC各種:IT部隊
ダウソ:サイバーテロ
ハード・業界板:工作活動
案内:情報管理、資料作成&管理
無線:独自の通信網構築
ニュー速:情報収集
写真撮影:盗撮、記録映像
ネトヲチ:ネット監視
実況(番組):マスコミ情報確認
就職&転職:企業調査
社会・世評:世論調査&操作
男性論女性論:プロファイリング
世界情勢:世界に発信
マスコミ:タレコミ
警察:通報
アウトロー:丁寧に苦情申し立て
ちくり裏事情:密告
運営:工作員排除

274 :デフォルトの名無しさん:2011/04/27(水) 15:56:54.07
be:賞金(ポイント)収集&配布
議員・選挙&政治家語録:政治介入
運輸・交通:物資運搬
花火:火薬調達
科学&物理&生物:BC兵器開発
郵便・郵政:ヒットマン用衣装提供
FLASH:FLASH製作
半角二次:応援ポスター制作、漫画・アニメ系板住民釣る
ダンス:応援ダンス製作
AA:AA製作
音楽各種板:鼓舞
お菓子:うまい棒補給
環境・電力:自家発電
ペット・癒し:精神安定
介護・福祉:負傷者介護
ボランティア:各種サポート
戦国時代:動かざること山の如し
ネ実:現実逃避
自衛隊:最終兵器

275 :デフォルトの名無しさん:2011/04/27(水) 18:34:43.03
正鵠を得るから来ているので的を得るが正しい
そもそも、射るのは矢の方で的じゃない
矢を射て的を得るだ

276 :デフォルトの名無しさん:2011/04/27(水) 19:29:07.00
だから、滑ってるのに。。。

277 :デフォルトの名無しさん:2011/04/27(水) 20:31:36.36
そもそも、なんでinjectionやsurjectionの訳語に「射」を使ったんだろう?
写像なんだから「単写」「全写」とすべきだったのではないのか。

278 :デフォルトの名無しさん:2011/04/27(水) 21:29:23.28
>>277
そんなこと考えたこともなかった。
jectがラテン語で「投げる」という意味らしいから、「写す」よりも「射る」のほうが若干違いかな。

279 :デフォルトの名無しさん:2011/04/27(水) 21:30:20.23
>>278
×違いかな。
○近いかな。

280 :デフォルトの名無しさん:2011/04/27(水) 21:42:45.12
>>277
矢印を書いて説明してたから

281 :デフォルトの名無しさん:2011/04/27(水) 21:44:48.67
写像を説明するときも矢印を書くべきだったな

282 :デフォルトの名無しさん:2011/04/27(水) 21:47:58.81
写像はmapだから区別したかったんでしょう

むしろ、injection と return をごっちゃにしてるのを問題にすべき

283 :デフォルトの名無しさん:2011/04/28(木) 00:08:54.76
なんかすごい核心臭いんだが、突っ込みづらいな。

284 :デフォルトの名無しさん:2011/04/28(木) 03:47:39.78
ghcのガベコレはJVMのそれの足下にも及ばないの?

285 :デフォルトの名無しさん:2011/04/28(木) 14:17:52.66
Mapの更新ってミュータブルにやるの?

286 :デフォルトの名無しさん:2011/04/28(木) 17:01:05.92
>>285
更新に必要な部分は、もちろん以前のものを破壊的更新せずにコピーしているはずなので、その意味ではイミュータブル。

しかし、以前のスレで話題になったリストと同じだけど、運がよければコピーしなければならない「更新に必要な部分」は少ない。
削除や追加で木のローテーションが起きなければ、「更新に必要な部分」は木の根元から更新したい葉まで一直線に結んだ部分だと思う。
ローテーションが起きれば最悪、木全部を作り直しと同じ空間コストじゃないかな。

287 :デフォルトの名無しさん:2011/04/28(木) 17:21:16.76
(´・ω・`)はい

288 :デフォルトの名無しさん:2011/04/28(木) 20:43:52.36
最悪でも木の高さに比例するメモリ操作で済むよ

回転一回あたりに確保されるメモリの大きさは定数で、
回転の回数は最大でも木の高さに等しい

289 :デフォルトの名無しさん:2011/04/29(金) 11:19:56.09
二つの木t1 t2を比較する時に
葉同士の比較まで潜った後その上の幹に一旦戻って別の前提条件で比較
(重いので葉同士の比較が失敗した時だけ行うようにしたい)とかするには
現在見ている木の上を参照するために潜るたびに現在の木そのものを渡す
つまり一つ上の木を常に保持するようにしなきゃならんのですかね?

290 :デフォルトの名無しさん:2011/04/29(金) 20:31:21.23
何がやりたいのか分からんが想像で答えると、
「比較が失敗した」ことを示す値を返して、
一つ上のレベルはその値を見て対処すればいいんじゃね

291 :デフォルトの名無しさん:2011/04/30(土) 08:27:51.94
なぁ結局そういうデータ構造は副作用行ける言語なら内部で副作用させてカプセル化しとけば、スピードも速くておけーとこでFAすか。

292 :デフォルトの名無しさん:2011/04/30(土) 11:42:29.23
意味が分からん、まともに話せ

293 :デフォルトの名無しさん:2011/04/30(土) 11:46:22.59
説明は遅延されているので、必要に応じて評価してください

294 :デフォルトの名無しさん:2011/04/30(土) 11:55:53.87
継続渡しスタイルだと引数にこれからやること全部渡すんだぜ
信じられないだろ

295 :デフォルトの名無しさん:2011/04/30(土) 11:56:51.50
>>293
そのギャグが面白いと思う人ってどのくらい居るんだろ

296 :デフォルトの名無しさん:2011/04/30(土) 12:17:44.99
関数型言語(主にLISP)の書籍とかWebサイトで、「こんな関数も継続渡しスタイルだと末尾再帰にできるよ!」っていう紹介があるけど、ああいう書きかえって実践的に意味あるの? たんに悟りを得るための公案?

297 :デフォルトの名無しさん:2011/04/30(土) 12:29:27.28
無駄に増設したメモリを使い切りたいときに役立つ

298 :デフォルトの名無しさん:2011/04/30(土) 12:40:35.92
言語のスタックを使わずに実行できるから使ってるメモリ量が自明とか
オレ言語のインタープリタを作ってCPSに変換するとコンパイラになるとか

意味ないな

299 :デフォルトの名無しさん:2011/04/30(土) 12:43:21.96
>>296
末尾再帰にすることによって確実に処理速度が上がる言語であれば、
処理速度を上げるために多少視認性を犠牲にしてでも末尾再帰にする意味はある
たんに悟りを得るための公案では断じてない

が、本来は(というか理想は)コンパイラがその書き換えを自動でやるべきこと

例えば GHC の場合、末尾再帰ではなく deforestation の話だが、
ソース中にヒントを書いておくことでプログラマの代わりにコンパイラが
自動でやってくれる(まだまだ完璧ではないが)

300 :デフォルトの名無しさん:2011/04/30(土) 14:47:16.22
Haskellは遅い
C++には適わなくともせめてJavaには勝って欲しい

301 :デフォルトの名無しさん:2011/04/30(土) 14:54:03.14
そうだな
プログラマが工夫しなければ、まだまだ遅いな

302 :デフォルトの名無しさん:2011/04/30(土) 15:34:49.89
速くなる余地がまだまだたくさんあってそれが生かされればC++やJavaと同等になるとは聞く

303 :デフォルトの名無しさん:2011/04/30(土) 15:57:19.87
やたらと楽観的な見通しを述べる奴が結構な割合でいるからな

304 :デフォルトの名無しさん:2011/04/30(土) 16:01:00.09
>>296
・論文を書くときに数学的な表現を統一できる
・「これは末尾再帰で表現きるから、定理○○が成り立つ」みたいな言い方ができる
・末尾再帰専用の高速化手法がある
・というか、Schemeは全部の関数が継続渡し

305 :デフォルトの名無しさん:2011/04/30(土) 16:06:11.32
開発期間から実行時間や保守費用まで全部含めて考えたとき、Haskellを完璧に理解してる人間がプログラミングすればC++にも勝てると思ってるけど、そうでもないの?

実行時間だけ考えればアセンブラ最高だし
航空機のプログラミング言語見たことあるけど、Cのソースコードにアセンブラが埋め込んであった

306 :デフォルトの名無しさん:2011/04/30(土) 16:24:12.32
航空機とかエヴァのマギシステムってGC使えるの?
悠長にゴミ集めしてる場合じゃない局面があると思うの

307 :デフォルトの名無しさん:2011/04/30(土) 16:38:09.79
Haskellをランタイムを含めてフルに使うんじゃなくて
型システムだけ使ってメモリ管理は手でやるとかもありそう
sel4みたいにverificationのみに使うとか

308 :デフォルトの名無しさん:2011/04/30(土) 16:48:35.09
形式手法が目当てならHaskellよりもっといいものが他にある

309 :デフォルトの名無しさん:2011/04/30(土) 17:13:27.58
>>306
航空機の場合、悠長にゴミ集めしてる場合じゃない局面では無い時に必死でゴミ集めして、
悠長にゴミ集めしてる場合じゃない局面でゴミ集めしないで働ける保証があるなら、GC が使える
その保証を得るのが難しいと思うが

エヴァのマギシステムの場合、ヒトと同じような思考をするコンピュータなので、
そもそもGC的な意味でのゴミがゴミで無くなる
人の記憶も不要な記憶(短期記憶でさえ)がゴミとして消されるわけじゃなく、
以前の記憶やその後に作られた記憶と絡み合う

310 :デフォルトの名無しさん:2011/04/30(土) 17:16:44.47
このスレの古参でHaskellに見切りつけた人っている?

311 :デフォルトの名無しさん:2011/04/30(土) 17:21:28.45
>>306
MAGIはそもそもノイマン式コンピュータかどうか…
あれ、有機体を使ってあっても驚かない。

JavaでリアルタイムGCを使ってロボットを動かす研究とかあるから、いずれは飛行機のデバイスもGCを使うようになるかも。

あと、個人的には、一つ二つのユニットがGCで時間かかりすぎ→強制リブートとなっても、冗長性を保っていれば問題ない、っていう発想はありえると思う。
そういう思想は飛行機とか、医療機器とかの世界ではまだまだ受け入れられないかな。

312 :デフォルトの名無しさん:2011/04/30(土) 17:21:53.24
>>309
例外的にそういう局面に急に陥る事もあると考えると
やはり危ないのでは

313 :デフォルトの名無しさん:2011/04/30(土) 17:29:33.97
航空機とかは、そもそも「ゴミ」を発生させてはいけない
途中で消えるオブジェクトを用意してはならない
全部staticでメモリが用意される

と昔に習った気がする

314 :デフォルトの名無しさん:2011/05/01(日) 02:42:08.24
"Plugging a Space Leak with an Arrow" という論文に、

succ n = n : map (+1) (succ n)

は計算に O(n^2) の時間がかかるが、

succ n = let ns = n : map (+1) ns ; in ns

にすれば改善できる、と書かれていました。
(オーダーが下がるとは明記されていない)

前者は succ n を毎回簡約しなければならないのに対して、
後者は最初に1回だけ簡約すれば、それが ns の参照先として保存されるため、
簡約ステップ数が前者に比べて少なくて済むのは分かります。

しかし、ノートに簡約ステップを書き出してみたところ、
後者も依然として O(n^2) のステップ数が必要に感じたのですが、
オーダーは実際には下がっているのでしょうか?

315 :デフォルトの名無しさん:2011/05/01(日) 04:23:26.98
>>314
succ n = n : map (+1) (succ n)
これ↑無限ループのような気がします


316 :デフォルトの名無しさん:2011/05/01(日) 05:36:44.26
>>314
nの値は計算量に関係ないよな。take m (succ n)の評価を考える
まずリスト部分だけ簡約すると、

let
  x1 = n + 1
  x2 = x1 + 1
  x3 = x2 + 1
(...略...)
  xm = xm' + 1
in n : x1 : x2 : x3 : ...略... : xm : []

みたいになる。ここまで簡約する計算量がO(m)
ここから足し算をすべて計算するのもO(m)だから、合わせてO(m)時間

317 :デフォルトの名無しさん:2011/05/01(日) 06:57:01.00
>>314
>>316のいうとおり、nの大きさは計算量に関係ないが、しかし、take m (succ n)としたとき前者はO(m^2)、後者はO(m)のオーダーになっているように思う。
前者はいわば
let
 x1 = n
 x2 = n + 1
 x3 = n + 1 + 1
 x4 = n + 1 + 1 + 1



in x1 : x2 : x3 : x4 ...

のような計算をしている。しかし、後者は
let
 x1 = n
 x2 = x1 + 1
 x3 = x2 + 1
 x4 = x3 + 1



in x1 : x2 : x3 : x4...

のような計算をしている。

前者はx1、x2...に相当するようなものを覚えていないが、後者はnsの中で覚えているので。
簡約と一緒に、コンスセルの間の矢印を書いたほうが良い。
そうすれば、前者だといちいち計算しなおしているものを、後者だと共有していることが分かるはず。

318 :316:2011/05/01(日) 07:44:49.25
.>>317
それと同じことが言いたかった
>>316は後者についての話ね

319 :317:2011/05/01(日) 07:56:37.26
>>318
む。オレの読解力が足りなかったみたい。スマン。

320 :デフォルトの名無しさん:2011/05/01(日) 08:39:16.51
Haskellのプログラムを書くときは
コンスセルのグラフが評価のたびに書き換わっていくイメージ
で書くと良いかも。

321 :デフォルトの名無しさん:2011/05/01(日) 10:22:21.44
T (take m (succ n))みたいな式を変形していったら
A + B + ... T m * Tm + ...という形になるからO(m^2)
A + B + ... C * (T m) + ...という形になるからO(m)とかそういう手法は無いの?

322 :デフォルトの名無しさん:2011/05/01(日) 13:29:46.92
I couldn't manipulate Parsec module.
Can anyone show the way to parse (and convert to a list afterward)
"(3)[1e-2,0.1,1.0]"
which means
(length)[elements]

...Sorry about English. Please reply in Japanese!

323 :デフォルトの名無しさん:2011/05/01(日) 14:09:13.39
Parsec2で
import Text.ParserCombinators.Parsec
import Text.ParserCombinators.Parsec.Language
import Text.ParserCombinators.Parsec.Token

sizedListParser :: CharParser st [Double]
sizedListParser = do
  size <- between (char '(') (char ')') int
  list <- between (char '[') (char ']') $
    double `sepBy` char ','
  if fromIntegral (length list) == size
    then return list
    else fail "length mismatch"

int :: CharParser st Integer
int = decimal haskell

double :: CharParser st Double
double = float haskell

324 :デフォルトの名無しさん:2011/05/01(日) 14:23:34.00
Thank you for your simple solution!
It rejects minus sign and integer mixed array, but I'll try to figure it out.
Hope there's a good documentation on the parsec...

325 :デフォルトの名無しさん:2011/05/01(日) 14:43:35.68
偶然だろうけど、>>323が一文字だけ日本語なのに妙な律儀さを感じてウケた。

326 :314:2011/05/01(日) 14:45:41.62
すいません、n には依存しませんね。
私も自分で take m で計算量を調べてました。

まだ納得できないです。
後者の計算で、次のようなステップを考えてました。
take の第1引数の引き算を端折ったり、冗長なステップもありますが、
問題はそこではありません。

[01] take 3 (succ 1)
[02] take 3 ns -- <== ns = 1 : map (+1) ns
[03] take 3 (1 : map (+1) ns)
[04] 1 : take 2 (tail ns)
[05] 1 : take 2 (map (+1) ns)
[06] 1 : take 2 (map (+1) (1 : map (+1) ns))
[07] 1 : take 2 (((+1)1) : map (+1) (tail ns))
[08] 1 : ((+1)1) : take 1 (map (+1) (tail ns))
[09] 1 : ((+1)1) : take 1 (map (+1) (map (+1) ns))
[10] 1 : ((+1)1) : take 1 (map (+1) (map (+1) (1 : map (+1) ns)))
[11] 1 : ((+1)1) : take 1 (map (+1) (((+1)1) : map (+1) ns))

コンスセルの指しているものをグラフを描いて考えてみたのですが、どうしても、
[11] の左側の ((+1)1) と右側の ((+1)1) が別物にしか思えないです。
つまり、たまたま同じ引数に同じ関数を適用しているだけで、
結局のところ2回同じ計算しなければならないと思います。

これらが同じものを指しているのなら、
>>317 の後者のようにリストの各要素は定数時間で計算できるのですが、
別物を指しているように見えるので、リストの各要素は線形時間かかるように見えます。
(全体の計算量というのは結局のところ、簡約ではなくプリミティブな計算の量ですよね)

なぜ左側の ((+1)1) と右側の ((+1)1) が同じものと言えるのか、もう少し考えてみます。
(ちなみに、(+1) は両者で同じ物、1 も両者で同じ物だと思います)

327 :デフォルトの名無しさん:2011/05/01(日) 17:35:44.94
c言語でデバッグするときは、適当にprintf文を書きますよね?

Haskellでデバッグするときってどうするんですかね?
putStrを挿入したら、関数の型がIOに変わってしまいますけど、他に方法ないですかね?

328 :デフォルトの名無しさん:2011/05/01(日) 17:55:21.50
>>327
putStrじゃなくてDebug.Trace.traceを挿入する

329 :デフォルトの名無しさん:2011/05/01(日) 18:05:31.50
MLが活発すぎてとても追いつけそうにない

330 :デフォルトの名無しさん:2011/05/01(日) 18:11:33.56
>>328
これ、便利ですな

import Debug.Trace

frac :: Int -> Int
frac 0 = 1
frac n = (Debug.Trace.trace (show n) n) * frac (n-1) * (Debug.Trace.trace (show n) 1)

331 :デフォルトの名無しさん:2011/05/01(日) 18:16:05.34
MLは終わった言語

332 :デフォルトの名無しさん:2011/05/01(日) 18:16:44.17
>>327
Debug.Traceかな:
http://www.haskell.org/ghc/docs/7.0.1/html/libraries/base-4.3.0.0/Debug-Trace.html

基本的な使い方は、
import Debug.Trace
myFunc a b = trace "myFunc" $ a + b
みたいにすれば、myFuncが呼び出されるごとに、myFuncがプリントされる。

ただ、Haskellでは、デバッグするときに、ある関数がいつ評価されるのかにあまり意味はなくって、ある関数の引数と返り値が意図した対応をしているのかが問題になるので、
Debug.Traceのtraceも、関数がいつ評価されたかを確認するよりも、関数の引数と返り値をチェックするために使うように自然になっていくように思う。

それなら、Test.QuickCheckを使ったほうがスマートなんじゃね? と思いつつ、いまでもDebug.Traceユーザーなオレ。

333 :デフォルトの名無しさん:2011/05/01(日) 19:37:35.71
haskellのメーリングリストっていう意味

334 :デフォルトの名無しさん:2011/05/01(日) 19:40:23.02
英語のメーリングリストに登録してるけど、メーラーで自動振り分けしてるから、気付いたら30件くらい溜まってて読む気なくす

335 :デフォルトの名無しさん:2011/05/01(日) 19:55:01.13
俺は去年の8月から購読してるけどほとんど読んでなくてついに未開封1万件を突破した

336 :314:2011/05/01(日) 23:02:38.55
混乱してきたので、頭を整理するために確認させて欲しいのですが、

take と map の定義がそれぞれ次のものだとします。
(再帰を停止させる条件は省きます)

take n (x:xs) = n : take (n-1) xs
map f (x:xs) = (f x) : map f xs

succ の定義として >>314 の後者を使い、take n (succ 1) の計算で、
x1:x2:x3: ・・・ : (take 0・・・)の形になるまで簡約させるとします。
x1 や x2 自体はまだ評価しません。

この場合において、take や map の左辺を右辺で置き換える(評価する)回数を調べました。
take を置き換える回数を t、map を置き換える回数を m と略記すると、

n t m
1 1 0
2 2 1
3 3 3
4 4 6

2行目は take 2 (succ 1) の場合に take が 2 回、map が 1 回置き換えられるという意味です。
他の行も同様です。

map を置き換える回数は n に対して O(n^2) のオーダーです。
なので、take n (succ 1) を計算するのに少なくとも O(n^2) の計算量は必要になると思います。

しかし実際は皆さんの言われるように O(n) だと思うので、
この考え方は間違っているはずなのですが、何処が間違っているのか分かりません。

337 :デフォルトの名無しさん:2011/05/01(日) 23:14:18.64
>>336
>326を見たけど、つまづきの原因はここだと思う。
> [11] の左側の ((+1)1) と右側の ((+1)1) が別物にしか思えないです。

グラフ簡約ではこれは同じ物になるということがわかれば、O(m)だと
納得できるんじゃないかな。

ポイントはns = 1 : map (+1) nsの両辺のnsは同じ実体を参照していること。
だから、いくら展開されても実体は常にひとつしかない。


338 :314:2011/05/02(月) 07:54:24.73
勘違いしているヶ所を絞り込みたいので、
変数が指し示しているものを細かく確認していきます。
ここで、「同じものを指している」という言葉は、
グラフ簡約で同じ対象を指し示しているという意味で使ってます。

succ の定義として >>314 の後者を使い、take 3 (succ 1) の計算で、

take 3 (succ 1)
= take 3 (1 : map (+1) ns)

ここで、2段目の式の変数 ns は
take の第2引数であるリスト 1 : map (+1) ns を 指していますよね。
次に、

take 3 (1 : map (+1) ns)
= 1 : take 2 (map (+1) ns)
= 1 : take 2 (map (+1) (1 : map (+1) ns)

ここで、3段目の式の2つの変数 map は同じ関数を指していますよね。
そして、変数 ns はリスト 1 : map (+1) ns を指している。
次に、

1 : take 2 (map (+1) (1 : map (+1) ns))
= 1 : take 2 (((+1)1) : map (+1) (map (+1) ns))

ここで、2段目の式の変数 ns が指しているものは、
((+1)1) : map (+1) (map (+1) ns) というリストではなく、
1 : map (+1) ns というリストですよね。

まずここまで合ってるでしょうか?

339 :デフォルトの名無しさん:2011/05/02(月) 09:33:03.55
>>338
あってない。

まず、最初の状態はこのような循環構造になっている。

ns -> 1 : map (+1) ns
     ^----------+

実体をわかりやすくするために、上のmap (+1) nsをns1と表す。
つまり ns = 1 : ns1とする。

簡約は次のように進む。

take 3 (succ 1)
= take 3 (1 : ns1)
= 1 : take 2 ns1

さらに簡約を進めるためにはns1の評価が必要になる。
ns1はmap (+1) nsなので、これを簡約すると
map内のパターンマッチによりnsが先頭(1)と残り(ns1)にわけられ、
先頭には(+1)、残りにはmap (+1)が適用される。

= 1 : take 2 ((+1) 1 : map (+1) ns1)
= 1 : (+1) 1 : take 1 (map (+1) ns1)

後は、この過程の繰り返しとなるので省略。

340 :デフォルトの名無しさん:2011/05/02(月) 17:58:18.44
>>331
メーリングリストだろ


341 :314:2011/05/02(月) 21:09:52.35
>>339
その続きをやってみます。

= 1 : (+1) 1 : take 1 (map (+1) ns1)
= 1 : (+1) 1 : take 1 (map (+1) (map (+1) ns))
= 1 : (+1) 1 : take 1 (map (+1) (map (+1) (1:ns1)))
= 1 : (+1) 1 : take 1 (map (+1) ((+1) 1 : map (+1) ns1))

ここで、左側の (+1) 1 は (:) ((+1)1) (take 1 ...) という関数適用の第1引数です。
右側の (+1) 1 は (:) ((+1)1) (map ...) という関数適用の第1引数です。

前者の (:) 関数の第1引数と、後者の (:) 関数の第1引数は、
グラフ簡約で同じものを指しているということですよね。
その理屈が分からないんです。

両者の (+1) という名前がグラフ簡約で
ひとつの同じもの(引数に1を足す関数)を指しているのは分かります。

また両者の(引数である)1 という名前がグラフ簡約で
ひとつの同じもの(1という値)を指しているのも分かります。

しかし、両者の (:) がその第1引数として同じものを指しているのが分からない。

map の定義 map f (x:xs) = f x : map f xs において、
f x という関数適用は引数が x:xs にパターンマッチした後で
毎回新しく生まれませんか?

342 :デフォルトの名無しさん:2011/05/03(火) 06:54:15.30
>>341
> その続きをやってみます。
>
> = 1 : (+1) 1 : take 1 (map (+1) ns1)
> = 1 : (+1) 1 : take 1 (map (+1) (map (+1) ns))

ここですでに違う。
前回の最後の状態はこのようになっている。

ns -> 1 : (+1) 1 : map (+1) ns1
       ^-------------+

実体をわかりやすくするために、上のmap (+1) ns1をns2と表す。
つまり ns1 = (+1) 1 : ns2とする。

take 1 (map (+1) ns1)の簡約は次のように進む.

take 1 (map (+1) ns1)
= take 1 (((+1)^2 1) : map (+1) ns2)
= (+1)^2 1 : take 0 (map (+1) ns2)

343 :デフォルトの名無しさん:2011/05/03(火) 12:23:12.26
HaskellスレはPerl忍者が入り込めない結界が張られているのですか?

344 :デフォルトの名無しさん:2011/05/03(火) 12:52:04.14
構造上言うことができないだけだ。

345 :デフォルトの名無しさん:2011/05/03(火) 13:07:50.94
むしろ忍者は歓迎だと思われ。
Perlは知らんが

346 :デフォルトの名無しさん:2011/05/03(火) 13:11:53.06
過疎スレだからな。
Anything is better than nothing.

347 :デフォルトの名無しさん:2011/05/03(火) 13:18:55.85
>>343
他のスレには蔓延ってるのですか?

348 :314:2011/05/03(火) 14:35:22.70
>>342
ns は最初 1 : map (+1) ns というリストを指していたのに、
>>339 の最後の段階では 1 : (+1) 1 : map (+1) ns1 というリストを指すように変わったのですね。

しかし、すいません、いつ何故変わったのか理解できていません。

>>339 の簡約の様子を少し丁寧に書き下すと、次のようになります。

[1] take 3 (succ 1)
[2] take 3 (1 : ns1)
[3] 1 : take 2 ns1
[4] 1 : take 2 (map (+1) ns)

ここまでで、まだ ns -> 1 : ns1、つまり ns -> 1 : map (+1) ns ですよね。

[5] 1 : take 2 (map (+1) (1 : ns1))
[6] 1 : take 2 ((+1) 1 : map (+1) ns1)

この、[5]から[6]への map 関数の簡約によって、
ns -> 1 : map (+1) ns から ns -> 1 : (+1) 1 : map (+1) ns1 に変わったのですか?

349 :デフォルトの名無しさん:2011/05/03(火) 14:48:19.22
そういえばGHCってソースをステップごとにプリコンパイルしたようなコードを出力できなかったっけ?

350 :デフォルトの名無しさん:2011/05/04(水) 09:31:55.94
>>348
そうそう。
そうなる理由は簡約機械(STG)の仕様の問題だから、
その説明を読めばわかると思う。
逆にソースレベルの等式だけから理解するのは無理。


351 :デフォルトの名無しさん:2011/05/04(水) 11:11:37.56
STGまで行く前に融合変換等の最適化でlet使う方もベタの定義もなったりしないの?

352 :314:2011/05/04(水) 11:44:17.29
>>350
おかげさまで、だいぶ核心に近づいた気がします。
2点確認したいことがあります。

ひとつ、最初の質問の式の後者の式が O(n^2) ではなく O(n) になるのは、
Haskell の仕様ではなく、そのコンパイラのひとつである GHC の仕様のためなのですね。
(今時どの実装でもそうなってるという話は置いておいて)

もうひとつ、>>348 の map 関数の適用で ns が指すものが変わるのでしたら、
[2]から[3]への take 関数の適用では ns の指すものは変わらないのでしょうか。


最後に、GHC の STG の仕様を調べてみたいのですが、どれなのでしょうか。
"Implementing lazy functional languages on stock hardware"
という論文ではないですよね。

353 :デフォルトの名無しさん:2011/05/04(水) 12:42:52.63
お前ら物知りだなぁ

354 :デフォルトの名無しさん:2011/05/04(水) 13:05:10.84
Haskellで音声認識を400行で書いたという話。
ttp://www.furui.cs.titech.ac.jp/~shinot/husky/
ttp://ideone.com/8JlUl

メイン関数はこんな感じ
main = do
args <- getArgs
case args of
[config, wfstf, spdff, scpf] -> do {
config <- readConfig config;
wfst <- wfstFromFile wfstf config; seq wfst (print (finalSt wfst));
spdfs <- spdfsFromFile spdff; seq spdfs (print (inspectSpdfs spdfs));
scp <- readScpFile scpf;
mapM_ (decodeWfstMain config wfst spdfs) scp
}
_ -> putStrLn "error: husky config wfstf spdff scpf"

355 :デフォルトの名無しさん:2011/05/04(水) 13:29:21.39
hlintにかけてやったら文句言われそうな括弧の使い方だな

356 :デフォルトの名無しさん:2011/05/04(水) 13:46:26.39
はしゅけるしゅごい!!
でそれ何に使えるの?

357 :314:2011/05/04(水) 15:05:53.26
少なくとも「はしゅけるしゅごい」なんて馬鹿にして理解する気の無い人に分かるわけがない
即刻消えなさい

358 :デフォルトの名無しさん:2011/05/04(水) 16:19:01.07
うちわで盛り上がるのに使える

359 :デフォルトの名無しさん:2011/05/04(水) 16:33:33.98
正規表現のマッチがボトルネックだった(!)ので
regex-posixをregex-tdfaにしたら爆速でワロタ

360 :デフォルトの名無しさん:2011/05/04(水) 16:34:27.85
>>354 俺ならこうかな。セミコロンと括弧()とっただけだけど。
main = do
 case getArgs of
  [config, wfstf, spdff, scpf] -> do
   config <- readConfig config
   wfst <- wfstFromFile wfstf config
   seq wfst $ print $ finalSt wfst
   spdfs <- spdfsFromFile spdff
   seq spdfs $ print $ inspectSpdfs spdfs
   scp <- readScpFile scpf
   mapM_ (decodeWfstMain config wfst spdfs) scp
  }
 _ -> putStrLn "error: husky config wfstf spdff scpf"

361 :デフォルトの名無しさん:2011/05/04(水) 16:43:48.23
素直な人 f (g (h arg))
普通の人 f $ g $ h arg
性格が捻じ曲がった人 f . g . h $ arg

362 :デフォルトの名無しさん:2011/05/04(水) 17:14:10.03
>>361
:(;゙゚'ω゚'):

363 :デフォルトの名無しさん:2011/05/04(水) 17:26:17.44
>>361
なんでw
f.g.hを一つの関数に見立ててargを渡してるわけでしょ。
性格曲がってないし、普通だし。

364 :デフォルトの名無しさん:2011/05/04(水) 17:27:17.32
(\x -> f.g.h x) arg

365 :デフォルトの名無しさん:2011/05/04(水) 17:28:25.75
>>361
あと、f$g$h argだと再利用性が悪いじゃん。

366 :デフォルトの名無しさん:2011/05/04(水) 17:33:23.01
arg が IO とかついていた場合だと
f . g . h <$> arg
ってほぼそのままいける
f <$> g <$> h <$> arg
はちょっとしつこい

367 :デフォルトの名無しさん:2011/05/04(水) 17:50:49.49
>>364 がツッコんで欲しそうにこちらを見てるんだが、どうしようか

368 :デフォルトの名無しさん:2011/05/04(水) 18:31:09.87
始対象厨: f . g . h . const arg $ ()
プログラム全体を定数にするとなんか嬉しかったりすんのかな?

369 :デフォルトの名無しさん:2011/05/04(水) 23:14:21.82
>>352
どちらの質問もyes

最後については、その論文でもいいと思う。
最新の実装とは少し違うかも知れないけど、基本的な考え方は同じはず。
説明もわかりやすい。

370 :314:2011/05/04(水) 23:33:17.54
>>369
おつきあい頂きありがとうございました

結局この論文しか見当たらなかったので今読んでいる最中です

371 :デフォルトの名無しさん:2011/05/05(木) 00:57:49.19
isInfixOfってStringだと順番にしらべていくだけなんだね
ByteStringだとKMPだった

372 :デフォルトの名無しさん:2011/05/05(木) 03:46:33.93
>>370
Haskellの仕様には載ってないとはいえ、
「サンクの内容は一回しか評価されない」
というルールを満たす処理系ならどれでも同じ計算量になるよ

紙の上でグラフ簡約を追いかけるだけで十分理解できる内容で、
STG論文はこの話に関係ない詳細が多すぎて明らかな遠回りだと思う

373 :デフォルトの名無しさん:2011/05/05(木) 03:51:07.29
ghc -fext-core で確認すれば一発だと思います


374 :デフォルトの名無しさん:2011/05/05(木) 03:53:51.09
いやCoreを見たって構文糖を削ぎ落とされたソースが出てくるだけだろ

375 :デフォルトの名無しさん:2011/05/05(木) 04:07:54.56
>>374
構文糖を取る以外にも、ものすごく変な最適化してる


376 :314:2011/05/05(木) 09:40:06.90
>>372
ノートに何度も図を描いて簡約の様子を考えてみたのですが、
どうしても理解できませんでした

377 :デフォルトの名無しさん:2011/05/05(木) 14:49:38.05
俺スクリプトの一行目が#! /usr/bin/runghc ばっかりになってきた

378 :デフォルトの名無しさん:2011/05/05(木) 15:01:02.12
>>377
そのまま、全てのコマンドがhaskellで書かれたThis鳥作って出してくれ


379 :デフォルトの名無しさん:2011/05/05(木) 19:07:39.49
30行くらいの書き捨てプログラムをコンパイルして
バイナリのサイズが12MBとかになるとがっかりする

380 :デフォルトの名無しさん:2011/05/05(木) 20:10:04.48
書き捨てプログラムなのにバイナリの大きさが重要なの?

381 :デフォルトの名無しさん:2011/05/06(金) 00:29:45.44
バイナリのサイズが小さくならないのは、Haskellの仕様の問題なのか、GHCの最適化手法がウンコだからなのか
それともバイナリのサイズにこだわることがウンコなのか


382 :デフォルトの名無しさん:2011/05/06(金) 00:32:40.48
性的リンクだからじゃね

383 :デフォルトの名無しさん:2011/05/06(金) 00:46:03.33
main = return () だけだと 847K (strip すると 584K) だけど
単純に gtk hxt regex-tdfa haskeline parsec を import するだけで 36M (strip後20M) に膨れ上る

384 :デフォルトの名無しさん:2011/05/06(金) 01:03:03.16
逆に言うと、コンパイルしたらexeファイルだけ持っていけばOKってこと?


385 :デフォルトの名無しさん:2011/05/06(金) 01:07:44.26
>>384
はい


386 :デフォルトの名無しさん:2011/05/06(金) 04:28:24.87
バイナリのサイズを小さくしたかったらFFI


387 :デフォルトの名無しさん:2011/05/06(金) 05:39:16.69
ghcのデフォルト設定って静的リンクなのかよw

388 :デフォルトの名無しさん:2011/05/06(金) 05:40:48.10
あ、よく考えたらマイナー言語の場合はそっちの方が都合がいいのかもな
軽量な書き捨てプログラムはrunghc使えばいいし

389 :デフォルトの名無しさん:2011/05/06(金) 10:24:17.78
使うかどうか解らないからライブラリをダイナミックリンクするんじゃないの?
コンパイル時点で何を使うかはっきりしてるんだから静的リンクじゃん?

390 :デフォルトの名無しさん:2011/05/06(金) 10:29:53.98
ごめんなんでもない

391 :デフォルトの名無しさん:2011/05/06(金) 12:15:03.41
実行ファイルでかいなあと思ってたがそういうことか

392 :デフォルトの名無しさん:2011/05/06(金) 19:27:33.82
ただでさえ重いHaskellが仮想機械上で動くようになったら
Javaどころの贅肉じゃなくなるな

393 :デフォルトの名無しさん:2011/05/06(金) 19:32:41.25
Javaはポータブルなバイトコードだから思い
ネイティブなバイトコードを仮想機械で動かせばそれなりに早くなると思う

394 :デフォルトの名無しさん:2011/05/06(金) 19:53:13.15
何の話でしょう?llvm?

395 :デフォルトの名無しさん:2011/05/06(金) 20:02:21.76
>>392
実行速度とサイズは反比例するんですが。。。
まあ、理屈で言えばhaskellがc言語並に速くなるには、もっとサイズがデカくなる必要がある訳で

参照透明性が有るって事は、究極の最適化は、同じ関数に同じ引数が与えられたら、2度目以降は計算すっ飛ばして値が帰ってくるようにする事

実行された全ての関数の、全ての引数に対応した値が保持されるのが、究極の最適化

いくらメモリが有っても足りないから、現在の実装はそう言う実装じゃ無いだろうけどね

64bitOS向けに最適化進んだら、そう言う日も来るかもしれない


396 :デフォルトの名無しさん:2011/05/06(金) 20:35:47.44
rubyやpythonの本はないのに、RWHがある図書館てコジャレてる。

397 :デフォルトの名無しさん:2011/05/06(金) 21:16:23.36
>>395
それ、普通にメモライズとかメモ化って呼ばれてるテクニック

398 :デフォルトの名無しさん:2011/05/06(金) 21:25:57.15
>>397
言いたかったのは、テクニックじゃなくて、参照透明性が確保される事による、適用範囲の(理論上の)範囲の広さ


399 :デフォルトの名無しさん:2011/05/06(金) 21:33:58.40
>>397
64bitOS向けに最適化進んでも、そう言う日は絶対に来ない

IOストリーム(IO無限リスト)は
Haskell で一般的に(例えば FRP などで)使われるテクニックだけど、
それがあなたのいう究極の最適化方法では最適化できない

メモリが足りないというレベルではなく、根本的に不可能

400 :デフォルトの名無しさん:2011/05/06(金) 21:34:00.70
>>396
羨ましい。近所の図書館にはRubyの良書しかないな。
あと言語とは関係ないけど「WinMX完全ガイド」みたいな題名の本が図書館の棚に並んでるのを見ると、毎度何とも言えない気分になる。

401 :デフォルトの名無しさん:2011/05/06(金) 21:37:20.68
>>400
うちの近所の図書館にはrubyやpythonの本もRWHもある

402 :デフォルトの名無しさん:2011/05/07(土) 10:52:36.34
依存やらglibcやらでwindowsでyiのインストール出来ない

誰か教えて下さい


403 :314:2011/05/07(土) 13:43:52.80
おかげさまで、O(n) の計算量で済む理屈を納得することができました。
ありがとうございました。

404 :デフォルトの名無しさん:2011/05/07(土) 16:49:37.99
>>402
諦メロン
cairoフロントエンドはgtkとかのバイナリ取ってきてできたけどどうも動作が怪しい
vtyはフルスペックのncurses(pdcursesじゃ無理ってこと)がwindowsでは使えないから無理
公式はvteフロントエンド推奨だけどvteのビルドにフルスペックのncursesがいるので(ry
win32パッケージを使ってgdiフロントエンドみたいなものを作るしか無理!
でもそんなのできたらその日からyiのコミッタになれると思うよ!

405 :デフォルトの名無しさん:2011/05/07(土) 18:11:44.14
>401
美学ってのがないn
いや、うらやましいです。
他の分野より新陳代謝が早いからコンピュータ本を抱えるのは大変だろうなー。

406 :デフォルトの名無しさん:2011/05/07(土) 18:19:58.97
RWHはオライリーの電子書籍が半額の時に買ったけど
PDFは本当に楽だねw

407 :デフォルトの名無しさん:2011/05/07(土) 18:52:01.81
>>405
ところが全然「新陳代謝」しないんだよ
同じ棚に Python 3 の本とか、OpenOffice 1.0 の本もある
いい加減書庫に葬れよって思う

408 :デフォルトの名無しさん:2011/05/07(土) 19:10:54.10
Python3を葬るのは早くないだろうか…

409 :デフォルトの名無しさん:2011/05/07(土) 19:19:42.99
python3はなかったことに・・・

410 :デフォルトの名無しさん:2011/05/07(土) 21:04:45.92
Grapefruit ってサンプル見てもさっぱり、さーっぱり意味が分からないんだが
どこかに解説ってないの?

411 :デフォルトの名無しさん:2011/05/07(土) 22:02:20.80
論文読めばいいんじゃね?
http://www.haskell.org/haskellwiki/Grapefruit#Documentation
あとHaddockリファレンス

412 :デフォルトの名無しさん:2011/05/07(土) 22:26:38.35
ファンクション倶楽部秋イベントを開催します。
オブラブメンバーの中に潜んでいたLispやHaskellをこよなく愛するファンクショナリスト3名がオブジェクト倶楽部へ反旗をひるがえし、
「オブジェクト倶楽部秋イベント」ならぬ「ファンクション倶楽部秋イベント」を開催。
己が信じる関数道を熱くそしてフリーダムに語り尽くします。

413 :デフォルトの名無しさん:2011/05/07(土) 22:40:47.34
俺はCLOSの影響かlispってオブジェクト指向ってイメージ強いや

414 :デフォルトの名無しさん:2011/05/07(土) 22:50:43.36
>>411
せっかく紹介してくれたのにゴメン
根本が理解できない俺の能力では論文もリファレンスも無理だった

まだ研究レベルのGUIライブラリだと思って諦めるわ

415 :デフォルトの名無しさん:2011/05/07(土) 23:02:43.77
>>414
気にすんな
どうせ2,3年もたてば、いつものように開発放棄されるさ

416 :デフォルトの名無しさん:2011/05/07(土) 23:08:07.28
もうとっくに放棄されてる

417 :デフォルトの名無しさん:2011/05/07(土) 23:11:09.42
最後に頼れるのはgtk

418 :デフォルトの名無しさん:2011/05/07(土) 23:33:42.74
>>417
その上に構築するGUIライブラリの話なんだが・・・

419 :デフォルトの名無しさん:2011/05/07(土) 23:57:49.68
>>418
おまえはいつもそうだ
結論を曖昧にすることで、正しいことを言っているような印象を抱かせる
「その上に構築するGUIライブラリの話」だから何なんだい?

420 :デフォルトの名無しさん:2011/05/08(日) 00:24:08.41
>>419
> おまえはいつもそうだ
意味が分からん

実際に正しいことを言っているような印象をお前が抱いたのなら、それでいいと思うぞ
間違っているという印象を抱いたのなら、その部分を指摘して質問してくれ
で、実際はどっちの印象を抱いたのだ?

Grapefruitに代表されるGUIライブラリは、
関数型らしくできるだけ宣言的にGUIを構築できるようにするために、
Gtk2HsやwxWidgetsに被せるラッパーだ

Grapefruitの目的が分かっていれば
「関数型らしくできるだけ宣言的にGUIを構築できるように」
これを前提とした話をしている事は自然と認識できると思うが
最後に頼れるのはgtkなどと次元の異なる発言があったので指摘した
ライブラリを使う「目的」が全く異なる

421 :デフォルトの名無しさん:2011/05/08(日) 12:01:51.45
ある程度の厳密さを求める話題に対して一行レスして、騒ぎになるのが2ちゃんねるですか。
ここぐらい多少のアカデミックさがあってもいいんじゃない?


422 :デフォルトの名無しさん:2011/05/08(日) 12:04:10.43
アカデミックは妥当じゃないかな。理性的ですね。

423 :デフォルトの名無しさん:2011/05/08(日) 13:41:14.64
最近Haskellへの興味が薄れ、XMonadじゃない他のWMを試してみようかと思ったんだけど、
scrotwmとか、設定ファイルにミスがあると挙動が分からなくなる。
コンパイルできたらほぼ確実にまともなプログラムとして動くってのは確かに便利だと実感した。
普段は型エラーがうざったく感じてたが、ナメてたわ。

424 :デフォルトの名無しさん:2011/05/08(日) 13:50:48.09
お前ら必要あんの?
Haskellって別に人数重要ってわけじゃないよね
労働みたいに重いものを運ぶから〜〜人必要って
秀才君は全部一人で作っちゃうよね まして君たちカスじゃ
相当できるやつ以外君たちクズはHaskellやらなくていいんじゃない?
知的好奇心を満たしたいなら一人でやってればいいと思うけどマジゴミみたいだね
まぁゴミみたいだね なんていうかゴミみたいですね カスだね

http://d.hatena.ne.jp/Minamo/20090329/1238345734

こいつ目的ゲーム業界なのにHaskellやっちゃって頭にウジわいてるんじゃないかな野菜のクズっておもいました

425 :デフォルトの名無しさん:2011/05/08(日) 13:51:26.76
だからお前ら死ねってことだ

426 :デフォルトの名無しさん:2011/05/08(日) 13:57:38.45
自己紹介が長いとあまりいい印象は持たれないよ
もうちょっと自分の特徴をまとめようよ
一言で表せると最高だ

427 :デフォルトの名無しさん:2011/05/08(日) 13:59:17.25
寒いから帰って良いよ根菜のクズ君

428 :デフォルトの名無しさん:2011/05/08(日) 13:59:40.35
寒いってお前のことね426さん

429 :デフォルトの名無しさん:2011/05/08(日) 14:02:43.16
>>426
3行でまとめず、1行でまとめような よしひろちゃん

430 :デフォルトの名無しさん:2011/05/08(日) 14:26:08.58
見事な春厨だ

431 :デフォルトの名無しさん:2011/05/08(日) 14:26:53.28
見事な厨厨

432 :デフォルトの名無しさん:2011/05/08(日) 14:40:57.13
次のオラ本の表紙はあらいぐまにケテーイ。

433 :デフォルトの名無しさん:2011/05/08(日) 18:31:33.46
アライグマ・動物(笑) シュシュシュ!

ドラゴンとか使わないんすね オライリー! シュシュ

かっこいいっすよ! ドラゴン シュシュ!

シュシュシュ ヘラクレスオオカブトとか意味わからないかっこつけてるんでしょうが シュシュシュ

変ですってあれ シュシュシュ なんていうすかね シュシュ

ひねったあげくあんな昆虫なんすか? シュシュシュ 意味わからないって シュシュシュ

寒いっすよ オライリーさん シュシュシュ パネーッス!!

434 :デフォルトの名無しさん:2011/05/08(日) 18:33:06.43
シュシュシュ

435 :デフォルトの名無しさん:2011/05/08(日) 19:06:29.53
ソイヤッ!ハイッ!ハイッ!

436 :デフォルトの名無しさん:2011/05/08(日) 19:23:41.49
シュシュシュってナニをこすってる音なんですか?

437 :デフォルトの名無しさん:2011/05/08(日) 19:36:13.10
機関車の音です

438 :デフォルトの名無しさん:2011/05/09(月) 00:20:00.07
卑猥っすね

439 :デフォルトの名無しさん:2011/05/09(月) 00:43:36.85
IDないからやりたい放題だな

440 :デフォルトの名無しさん:2011/05/09(月) 01:20:17.44
プログラミングHaskell買ってきた。
ふつうのHaskellは知りたいことが全部後回しでイライラした。
問題はGWが終わったことだ。

441 :デフォルトの名無しさん:2011/05/09(月) 05:51:00.56
愚痴じゃなくてHaskellの話題を書き込めよ。
死〜。

442 :デフォルトの名無しさん:2011/05/09(月) 19:53:54.23
Perl忍者はこのインターネットに潜む脅威 危険度 重大
彼は非常に、ネットの立ち回りがうまい。
攻め際と引き際がうまく出来ている。
一度食らったら、いったん引いて攻防を繰り広げており 勝てると思ったら全力で攻め続ける
素晴らしい戦闘スタイル 逃げ際には逃げうちで煽りを入れてから逃げる。
いったんネットの闇に身を潜め、チャンスを伺う。
彼は心理的要素も熟知しているため、炎上の仕組みまで理解している。
そう簡単に崩されることはない、その体制こそが、Ultimate Order アルティメットオーダー(究極の体制)
そして、いつ襲ってくるかわからない暗殺の脅威 危険極まりない人物こそがPerl忍者だ。
Perl忍者を追撃したところで、煙玉を巻かれて遁走のがオチだ。
Haskellスレではsuwabuki,イマイヨシヒロが犠牲になっている。

443 :デフォルトの名無しさん:2011/05/09(月) 22:02:59.08
錯誤が拡大する。

444 :デフォルトの名無しさん:2011/05/09(月) 23:58:29.31
かっこいい名前だな アルティメットオーダー。

445 :デフォルトの名無しさん:2011/05/10(火) 00:11:25.23
ここの人はPerl忍者さんに親切ですね 忍者さんはLL系の人達からはほぼ無視されています
Perl忍者さんを脅威に感じているのでしょう、なので敵対してます

彼らは余裕がありません、忍者さんに追いつかれたらまずいので教えようともしません
何も教えたりしていません彼らは、自分が追い抜かれたら大変なので
”常に下を作る”ことをしようとします、ですが忍者さんは彼らより優れています
私はそう思います
Haskellスレの方はアルカディアサーガスレの人たちより親切ですね
ここはPerl忍者さんにとって、第二の理想郷でしょう
皆さん、暖かくPerl忍者さんを迎え入れてください
最近忍者さんが2chに来ないのは、LL系プログラマからいじめにあったことです
彼はそのショックで引きこもったままです 2chに来ようとしません
”IRCのBAN、無視、LL系プログラマの嫉妬”により立ち直れないほどの心の傷をおったそうです
ですので、Perl忍者さんが来たら暖かく迎えましょう

446 :デフォルトの名無しさん:2011/05/10(火) 00:22:41.89
442の書き込みは、たぶんPerl忍者さんでしょう
いじめにより、脳みそが大トロ化してしまったそうです
それにより、思考力が低下し自作自演・妄言が激しくなり
引き篭もり、24時間体制で2chをやっていると聞いております

場合によってはPerl忍者さんは精神病院に隔離される場合があるので
大事に扱って下さい、Perl忍者さんと会議通話をしていたのですが
同じことを何回も繰り返しておりました、”シュシュシュ!! シュシュシュ!!”
と意味不明な言葉を発していました、とても不気味でしたがLL系プログラマから嫉妬をうけたあげく、いじめられたのが原因だと思って
そっとしといてあげました。
先ほど述べたIRCのBANというのはsora_hさんに嫉妬をしてチャンネルを荒らしてしまったのでしょう
そのせいでBANを食らって精神的なストレスにより、余計頭が狂ってしまったそうです
なんかいも、私にIRCでBAN解く方法を教えてくれ と狂ったように100回くらいメッセージを送ってきました
これはダメだと思い、病院に隔離してもらうようにサイバー警察に相談しました

447 :デフォルトの名無しさん:2011/05/10(火) 00:37:38.89
テスト用のゴミプログラムのソースファイルが1000くらいあるんですけど、上手な管理の方法ないですかね?
現在は 20110509glutTest.hs みたいに日付をつけて一つのフォルダに放り込んでます。


448 :デフォルトの名無しさん:2011/05/10(火) 05:31:39.28
よく分からんが普通にソース管理ツール使えばいいんじゃないのか?SVNでもGitでも

449 :デフォルトの名無しさん:2011/05/10(火) 07:08:27.25
それらはソース管理ツールじゃなくて、コンテンツのバージョン管理ツールだよ

450 :デフォルトの名無しさん:2011/05/10(火) 10:20:35.75
>>447
タグで管理できるようなツールを拾ってくるか作るとか。

451 :デフォルトの名無しさん:2011/05/10(火) 12:33:54.65
ツールを使っても、おそらく今の意識のままだと管理できなくなると思う
ちょっと回り道してでも整理術を学んだ方が結果的には早いのでは?

452 :デフォルトの名無しさん:2011/05/10(火) 12:51:20.05
ゴミなんか管理しなくていいだろ
全文検索ソフトを入れておけばおk

453 :デフォルトの名無しさん:2011/05/10(火) 13:01:39.94
全文検索の用意するのも面倒だからemacsのfind-grepに頼りきり

454 :デフォルトの名無しさん:2011/05/10(火) 14:16:16.11
お前らゴミがバージョン管理ツールとか使っても
まじいみねえから
きもちわりいんだよ デザインテロとかやってろよはげ

455 :デフォルトの名無しさん:2011/05/10(火) 20:49:21.16
ghciへの入力とかコンパイルコマンドとかの入力履歴を時系列でとにかく全部記録しておきたい
ghciで入力した文をコンパイルできるhsファイル1つに全部保存できたらいいんだけど、名前が競合するから、日付ごとに作ったファイルに入れてる
モジュールとか作るときは日付がないファイル名にするから管理が面倒くさくなる

456 :デフォルトの名無しさん:2011/05/11(水) 22:31:58.02
そんな同でもいいことに時間費やしてるおまえはマジクズ

457 :デフォルトの名無しさん:2011/05/11(水) 22:42:59.85
このスレってアカデミック色の強い言語に似合わず糞スレだよね

458 :デフォルトの名無しさん:2011/05/11(水) 22:47:56.39
ソフトウェアは超大量生産できるから、どうでもいいことでも、大変なことになる

459 :デフォルトの名無しさん:2011/05/11(水) 22:50:12.05
アカデミックと思っているのは数学が苦手な低学歴な奴だけだろ

460 :デフォルトの名無しさん:2011/05/11(水) 22:55:10.87
論文のためだけに書かれたメンテされてないライブラリの山を見れば
そういう言語なんだなあと

461 :デフォルトの名無しさん:2011/05/11(水) 23:02:05.29
oneiric language

462 :デフォルトの名無しさん:2011/05/12(木) 00:35:02.47
>455
rlwrapが便利だと思われる。$ rlwrap ghci で普通にghciが使えて、$HOME/.ghci_historyというファイルに履歴が残るよ。

463 :デフォルトの名無しさん:2011/05/12(木) 00:37:11.16
>>447
Haskellの人ってみんなdarcsかmercurial使ってると思ってたけど違うのかな。

464 :デフォルトの名無しさん:2011/05/12(木) 07:34:49.64
>>460
例えばどのライブラリ?

論文とその実装がセットで公開されているのは意外に珍しいから
煽り抜きでマジで興味ある

ライブラリ名とその論文を合わせていくつか教えてくれ

465 :デフォルトの名無しさん:2011/05/12(木) 07:54:44.71
460じゃないが、上で挙がってるGrapefruitとか?

466 :デフォルトの名無しさん:2011/05/12(木) 08:36:42.44
elereaがシンプルだし読みやすいのでおすすめ
論文も結構新しい部類だし、なんといっても分量が少ない

しかし論文とセットのFRPといえばやっぱ本家であるreactive
そしてしばらくメンテされてないという条件も満たしているwwww

FRPはCCAとstream fusionを使って強力な最適化ができるということが二年ほど前に示されたけど
このCCAなんと条件分岐ができないという欠点があるんでこれを克服したなんかが出ない限り前に進まないだろうなと予想している
FRPはC#のRxとかいろんな分野で広まろうとしているネタではあるのでこのまま死に絶えることはないと祈りたい

467 :デフォルトの名無しさん:2011/05/12(木) 12:41:17.98
個人的には Conal Elliott は信頼してる
きっと克服してくれる

468 :デフォルトの名無しさん:2011/05/12(木) 14:43:15.35
Haskellを使うメリットは何ですか?

469 :デフォルトの名無しさん:2011/05/12(木) 14:51:44.54
無限リスト

470 :デフォルトの名無しさん:2011/05/12(木) 15:05:56.41
基本的には副作用が無い事。

471 :Perl忍者lvl4 ◆M5ZWRnXOj6 :2011/05/12(木) 16:45:50.57
お前らのクズ親もクズHaskell使いのお前らもかわいそう

472 :Perl忍者lvl4 ◆M5ZWRnXOj6 :2011/05/12(木) 16:50:45.46
Perlスレでメモリ管理のこと話したがってるC齧りたてのバカが
「Perlで常駐プログラムでメモリ管理」みたいにわめいてるんだけど
本とバカだと思う本当に

473 :デフォルトの名無しさん:2011/05/12(木) 20:18:00.80
一般項ではなく漸化式で計算される数列の要素を持つリストがあるとします。
例えばフィボナッチ数列のリスト [1, 1, 2, 3, 5, 8・・・] などです。
このような数列の第n項までのリストを返す関数 f :: Int -> [Int] があるとします。

この関数がプログラムの複数の場所で必要とされており、
ある場所では第a項まで、別の場所では第b項まで計算されるという使われ方をします。

この場合、素朴なプログラムでは毎回先頭の項から必要な項まで
順に漸化式を解いていかなくてはなりません。
しかし a < b の場合、ある場所で第a項まで計算したのなら、
別の場所では第a+1項から第b項まで計算すればよく、
先頭項から第a項まで同じ計算をもう一度するのは非効率です。

この問題を解決する方法として2つ思い浮かびました。
ひとつは関数 f の戻り値としてリストの他に、
そのリストに連結する形で以降の項から計算し始める関数 f' も一緒に戻し、
上記の例で言えば第b項まで計算するのに f ではなく f' を使う方法。
ただし、この関数を使う側の方で f' を(State などで)持ち回す必要がある。

もうひとつは、関数 f の中で、計算し終わった分のリストを IORef に入れておく方法。
ただし、関数 f 自体も使う側も(関数 f のためだけに)IO モナドとなる。

他に方法はあるでしょうか。

(例に挙げたフィボナッチ数列は一般項が計算できますが、
今回の問題では一般項は計算できない前提でお願いします)

474 :デフォルトの名無しさん:2011/05/12(木) 20:40:42.47
無限リストにすればいいじゃない

475 :Perl忍者lvl4 ◆M5ZWRnXOj6 :2011/05/12(木) 21:19:34.51
最近、気軽にHaskellやるバカがふえたのは
まつもとひろゆきが、これからの言語はErlang,Haskellとかいってたからかな?
それに便乗してHaskellかじりだしたばかがふえてるのが目に立つんだけどむかつくぜ


476 :473:2011/05/12(木) 21:33:16.55
>>474
結局のところ関数 f の代わりに無限リストを使い、
それを使う場所で持ち回すということですね。

>>474 の前者の解決方法「持ち回し」と本質的には同じですよね。
(ストリームは継続で表現できますし)

477 :473:2011/05/12(木) 21:34:55.33
>>476
すいません、アンカーミスりました

>>473 の前者の解決方法「持ち回し」と本質的には同じですよね。

478 :デフォルトの名無しさん:2011/05/12(木) 22:34:45.77
memoize使えばいいんじゃねーの?

479 :473:2011/05/12(木) 22:54:08.87
>>474 >>478
申し訳ない、私の方が問題の本質を誤って捉えていました。
もう一度質問し直します。

ある情報を要素として持つリストがあります。
各要素の情報は、リストの先へ行くほどより正確なものになっていきます。

たとえば、数学的な関数 f(x) が極大となる x の位置という情報に対して、
[(a0, b0), (a1, b1), (a2, b2)・・・] というリストを考えます。
ai < x < bi であり、x=ai と x=bi の間に極大があることを表しています。
そして、 ai < ai+1、bi > bi+1 です。
適切な言い方か分かりませんが、情報の正確さにおいて単調増加するリストです。

各要素を「順番に計算して」このようなリストを作る関数 f があるのですが、
この関数 f(つまりリスト)はひとつのプログラムの中の複数の場所で使われます。

ある場所Aではある程度の正確さの情報があれば十分ですが、
別の場所Bではもっと正確な情報が必要、つまりリストのより先まで計算する必要があります。

必要なのはリストそのものでは無く、リストの要素です。
つまり場所Aである正確さの要素を得る計算を f の中でしてしまえば、
リストのそれ以前の要素はもう必要なく、GC の対象になって欲しいです。

もし場所Aより場所Bの方を先に計算するような流れになったら、
そこで得た正確さの情報は場所Aでも問題なく使えるので、
それ以前の要素は GC の対象になって欲しいです。

こういう仕組みを作るのに参考になりそうな論文などは無いでしょうか。
質問が曖昧すぎでしょうか?

480 :デフォルトの名無しさん:2011/05/13(金) 04:55:41.58
>>479
その要求(不要な先頭要素のGC)を満たすには何らかの方法で状態を扱うしかなさそう
StateでもIORefでもいいけど、無限リストの組み合せで実現するのが比較的シンプルだと思う
つまり(a0,b0):(a1,b1):...という無限リストをStateなどで引き回して、
値が必要になったらdropWhileで精度の足りない部分を捨てて使い、
それ以降の部分を新たな状態とする

> >>474 の前者の解決方法「持ち回し」と本質的には同じですよね。
無限リストをグローバルに定義するだけなら引き回しは必要ないよ
この場合、「必要ない要素のGC」は実現できないけど

481 :デフォルトの名無しさん:2011/05/13(金) 05:12:47.12
最急降下法のような反復的なアルゴリズムで値を求めていて、ある場所では少なくとも n1 回の反復が必要で、また別の場所では少なくとも n2 回必要なときに、
無駄な計算を省きつついいかんじに過去の値は捨てていきたいって話…?

482 :デフォルトの名無しさん:2011/05/13(金) 07:00:52.78
メモリ消費が問題になるなら、たとえば反復10回につき一要素しか持たないようにすれば、
グローバルに無限リストを持っても消費メモリは1/10になる
その代わり必要な精度を超えた反復が最大9回分発生するけど

483 :デフォルトの名無しさん:2011/05/13(金) 09:05:55.87
そういうのこそ副作用使えれば一発だな。
精度を表す指標と値のタプルををCurrentで返すようにして必要あればProceedで必要なとこまで進める。

484 :473:2011/05/13(金) 20:57:19.82
結局、たとえ IORef を使おうが、その IORef で包んだデータを持ち回さないと、
別の場所でその途中の精度まで計算した所の続きから計算し始めることができないんですね。
それは継続用の関数を戻り値として戻してても同じ。

その「持ち回し」というのが、つまりは状態を扱うという事なんですね。
グローバルで状態を管理しようが、一部ローカルで管理しようが、
状態を扱う仕組みとしては同じ事。

あれこれ考えるのは諦めて、素直に State か何かで状態を扱う方向で検討することにします。

ありがとうございました。

>>481
きっとそういう事です。

485 :デフォルトの名無しさん:2011/05/17(火) 00:59:05.74
あかん、haskellwiki読んでもhxtの使い方がさっぱりわからん……
Arrowについてあらかじめ知らなきゃ駄目なのか俺の読解力がないのか。
一番シンプルなXMLライブラリって何でしょうか?

486 :デフォルトの名無しさん:2011/05/17(火) 01:16:41.98
すんません
↓はカウントアップする関数なんですけど、

countUp :: State Int Int
countUp = do
  n <- get
  put (n+1)
  return n

get = State $ \s -> (s, s)

n <- get で get は State Int Int なのに、 n に整数が入る理屈が分かりません


487 :デフォルトの名無しさん:2011/05/17(火) 01:40:05.22
>>486
モナドクラスのインスタンスなのは (State Int) 型です。

M をモナドクラスのインスタンス、f の型を M A としたとき、
do { x <- f; ... }
で x の型は A なので、もし M A が State Int Int 型ならば x は Int 型になります。


488 :デフォルトの名無しさん:2011/05/17(火) 01:49:16.12
>>486
説明しようとして get を展開して

n <- ( State $ \s -> (s, s) )

と書いたらこっちも分からなくなった。


489 :デフォルトの名無しさん:2011/05/17(火) 02:03:47.07
>>488
それは、中にある組(s,s)のうち片方だけがnに束縛され、もう片方は捨てられるんだったと思う
getでは同じsなので違いはわからんけど
putの場合は以前のStateの(s,a)の中身は両方捨てて、putへの入力値と()のセットで新しく上書きするので
それで動作を調べたらいい
あと、自分が以前に質問したときは、新しいバージョンではStateコンストラクタは見えなくなり、
今はstate関数になってるって話だったよ

State s a型の場合、組の部分の値を型で表すと\s -> (s,a)ではなく\s -> (a,s)と逆順になってるのは理由があるのだろうか
覚えにくいからいつも忘れてしまう

490 :デフォルトの名無しさん:2011/05/17(火) 02:23:19.99
data MyState s a = MyState {runState:: (s -> (a, s, a, s, a, s))}

get :: MyState Int Int
get = MyState $ \s -> (s, s, s+s, s+s+s, s*s, s*s*s)

test = do
 n <- get
return n

この場合は n にどれが束縛されるんだろ…
>>= やputの実装も関係してくるのだろうか


491 :デフォルトの名無しさん:2011/05/17(火) 02:50:04.00
>>486
理屈を分かりたいなら、do記法の糖衣構文を解除(?)して、>>=と>>に書き換えたほうが良い。

>>490
非常にナンセンスな疑問に思えるが、ご想像通り、>>=の実装に依存する。

492 :デフォルトの名無しさん:2011/05/17(火) 02:52:56.87
>>490
そうだと思う。
自分にはStateモナドより、引数に状態を持ちまわる関数のほうがよっぽど使いやすい
Stateを使うと自分で手錠をはめているような感覚になるんだけど、
慣れた人はちゃんと使いこなしてるんだろうか
そこは結構な疑問
モナド変換子を覚えると違うの?

493 :デフォルトの名無しさん:2011/05/17(火) 03:17:24.81
引数のひとつと返り値(タプルによる多値)のひとつをget put用にするのがStateモナド。
結局引数もちまわりとやってることは変わらんが、
モナドに抽象化されているので、モナドの種類を変えたりTransformerをかぶせたり
といった操作をしやすい。

複数の関数の引数に同じものを食わすのを隠蔽するのがReaderモナドだし、
複数の関数の返り値のひとつを集めるのがWriterモナド。

関数を (入力の数) -> (出力の数) と表すと
Stateモナドは 2 -> 2 を
Readerモナドは 2 -> 1 を
Writerモナドは 1 -> 2 を
それぞれ (a -> m b)という型の 1 -> 1 なモナドの世界の関数として扱える方法という感じ。

494 :デフォルトの名無しさん:2011/05/17(火) 03:27:38.18
>>489
まず入出力+状態用の入出力をもつ関数

f :: (a,s) -> (b,s)

があって、それをカリー化して

f_curry :: a -> s -> (b,s)

newtypeで State s b = s -> (b,s)と置き換えて

f_monad :: a -> State s b (つまり Monad m => a -> m b の形)

のように、f を意味はそのままでモナドで使える f_monad に変形する。
それで(a,s)という順なのだと思う。
f' :: (a,s) -> (s,b)
から始めれば State s a = s -> (s,a) と定義することになるだろうけど、
こんな f' の型は不自然でしょってこと。

495 :485:2011/05/17(火) 17:40:30.39
http://www.haskell.org/haskellwiki/HXT/Conversion_of_Haskell_data_from/to_XML
これを見ているのですが、最初のサンプルのXMLの記法が偏りすぎてて参考になりません。
(attribute1個のみと仮定してMap使うわ、attribute無しの単なるelementがないわ)
例えば、
<hoge>
<piyo>
<entry id="1"><title>title1</title><body>body1</body></entry>
<entry id="2"><title>title2</title><body>body2</body></entry>
</piyo>
</hoge>
こんなXMLをpicklerを使って処理したい場合、Haskellでどういうデータ構造を定義して、どういうpicklerをつくればいいんでしょうか?

496 :485:2011/05/17(火) 20:41:24.95
自己解決しました。
後続の方のために説明したいんですが力量不足でうまく説明できないです、ごめんなさい。

497 :デフォルトの名無しさん:2011/05/17(火) 23:50:58.50
do構文の <- の展開方法を見たら複雑すぎて吹いた。
モナドを剥して変数を取り出すだけじゃなかったのね。


498 :デフォルトの名無しさん:2011/05/18(水) 21:21:35.10
>>494 納得しました

499 :デフォルトの名無しさん:2011/05/19(木) 12:17:46.81
内包表記で

[x | x <- [1, 2, 3]]

と記述したところ|が駄目らしくannotationsエラーが出てしまいます。

開発の環境が悪いのかなとも思いcodepadでも走らせてみましたが駄目でした。

何故でしょうか

500 :デフォルトの名無しさん:2011/05/19(木) 12:23:47.73
>>499
それと全く同じコードをghciに入れたら普通に動いたよ。
他の部分に問題があるんじゃないか

501 :デフォルトの名無しさん:2011/05/19(木) 13:18:45.61
>>499
それって、ファイルに直接記述してるんじゃないのかな。

n = [x | x <- [1, 2, 3]]

とかやって、bind するとかしないと、haskell のソースコード 的には、おかしい。

あと、codepad では、main が必要みたい。


502 :デフォルトの名無しさん:2011/05/20(金) 17:52:01.10
haskellwikiに書いてあるやりかたでwxWidgetsをMinGWでビルドしようとしているんだが、
メモリ使用量がすごいせいかldが落ちる……
MONOLITHIC=1とか無茶だろこれ。
オブジェクトファイルだけで500MB超してるんだぞこれ。

503 :502:2011/05/20(金) 17:53:26.21
500MBは言い過ぎかもしれないけど、400MB位は多分ある。
スレ違いすまん。

504 :デフォルトの名無しさん:2011/05/20(金) 18:07:50.87
たった500MBで大げさな

505 :502:2011/05/20(金) 18:12:59.57
そうも思って調べたらどうも他にもこのメモリ使用量に困っている人は何人かいるみたいだった。
MONOLITHIC=0でwxHaskellさんが認識してくれるのかどうか。
つーか、wxHaskell+Windowsでやろうとしてる人他にいないの?
wxWidgetsスレは過疎ってるし。

506 :473:2011/05/20(金) 18:58:04.36
>>505
GHC 7.0.3 で何回か挑戦したが、もう諦めた
前のいくつかのバージョンではちゃんとインストールできたんだがな

Gtk2Hs の方は比較的すんなりインストールできる
(GTK のコンパイルも要らんし、Cygwin とか MinGW も要らん)
これで特に問題ないから、wxWidgets の事は忘れて今ではずっと GTK だ

507 :502:2011/05/20(金) 19:25:01.99
またMONOLITHIC=1で落ちやがった。今度は5GBのページファイル用意しといたのに。
ただ、さすがに全部使い切ってはいないみたいだが……よくわからん。out of memory allocating.

>>506
ありがとう、gtk2hsにします。

508 :デフォルトの名無しさん:2011/05/20(金) 19:30:09.11
ldにパッチあてるとか

509 :デフォルトの名無しさん:2011/05/20(金) 20:35:07.78
windowsの原因不明なメモリ不足なら/3GBオプション有効にしてみるとか

510 :デフォルトの名無しさん:2011/05/20(金) 20:40:03.51
>>507
比較的すんなりインストールできると言っても、
以前インストールできてた頃の wxHaskell に比べてだ
Gtk2Hs でもちょっとした作業は要る

訊かれてはいないが、私がインストールできた手順を紹介しておく

1. http://www.gtk.org/download-windows.html へ行き
All-in-one bundles のバージョン 2.16 をダウンロードして、
空白無しのアルファベットのみの適当なパスに展開する
(2.22 は zlib.dll の deflateSetHeader 関数がエクスポートされていないからダメ)

2. 環境変数 %PATH% に All-in-one bundles の \bin ディレクトリへのパスと
GHC インストールフォルダ内の \mingw\bin ディレクトリへのパスを追加する

3. コマンドプロンプトで pkg-config --cflags gtk+-2.0 を実行して、
GTK が正しくインストールされていることを確認する

4. コマンドプロンプトで cabal install gtk2hs-buildtools を実行する

5. >>94 に従って、修正すべきパッケージをダウンロードし、
gtk2hs および必要なパッケージを個別にインストールする
その時インストール順に注意(依存関係のため。cabal info か HackageDB で分かる)

511 :507:2011/05/20(金) 22:02:14.70
>>510
ありがとうございます。どうやら成功したみたいです。
最初haskellwiki通りにやってうまくいかなくて、Web探し回っていろんな記述組み合わせて試しにやった方法がそれとほぼ同じでした。
書き込みに気がつかなくて依存関係をしらみつぶしにエラー出るたびに直してたので助かりました。
(あとhaskellwikiに書いてあったBladeバンドル版のGTK使って途中までインストールやったのでゴミが残ったかもしれませんが、気にしないことにします)
後から読む人のために補足しておくと、
・tarボールはcabal unpackで簡単にもってこれる
・Warningで言われるDCABAL_VERSION_MINORはつけなくて平気だった
・cabal unpackで持ってきた「gtk」のgtk/demo/helloでデモできる。runghcで動く。

>>508
どのパッチでしょうか?

>>509
そんな制限があったんですか、知りませんでした。
ただ、物理メモリが1GBからVRAM引いた分しかないので効果があるかどうか。
また時間があるとき試してみます。ありがとうございます。

512 :デフォルトの名無しさん:2011/05/20(金) 22:18:35.69
>>511
> tarボールはcabal unpackで簡単にもってこれる

これは私も知らなかった
簡単でいいな

513 :デフォルトの名無しさん:2011/05/20(金) 22:58:44.27
素直にWindowsパイナリを落とさない理由を知りたい

514 :デフォルトの名無しさん:2011/05/20(金) 23:01:18.92
Windowsバイナリだとwxパッケージのインストールに失敗しないか?

515 :デフォルトの名無しさん:2011/05/20(金) 23:16:55.90
>>511
こういうの
http://lists.gnu.org/archive/html/bug-binutils/2011-04/msg00138.html

516 :511:2011/05/21(土) 15:44:28.36
そろそろ本当にスレ違いですね、すみません。

>>515
ありがとうございます。
binutils-2.21-3-mingw32にhttp://sourceware.org/bugzilla/attachment.cgi?id=5675
手で当ててビルドしたldを使ってやりなおしてみました。
元のバイナリがこれより古かったかもしれないので単純比較できないですが、
パッチ前は40分〜せいぜい2,3時間でout of memoryで落ちたのが、今度は
12時間以上かかった後にcollect2: ld returned 5 exit statusで落ちました。
Athlon 64 X2 3800+,900MB RAM,WinXPの環境。
>>509の/3GBスイッチを付け忘れてしまいましたが、もうやり直す気力が萎えましたw
本格的にgtk2hs勉強しようかな。

>>513
MinGWビルドのMONOLITHICのバイナリが見つからないので……

517 :516:2011/05/21(土) 15:46:18.51
誤:out of memory
正:out of memory allocating

518 :511:2011/05/21(土) 15:49:41.53
連投すみません、これで最後です。なんかビルド見守ってて寝ぼけてるみたいです。
肝心なこと書き忘れてました、ビルドに失敗してるのはwxWidgets-2.8.12です。

519 :デフォルトの名無しさん:2011/05/21(土) 19:03:31.57
(2*) `map` [1,2,3]
じゃなくて,Rubyっぽく
[1,2,3] 何か (2*)
と書く方法を教えてください。


520 :デフォルトの名無しさん:2011/05/21(土) 19:12:14.73
map' xs f = map f xs

521 :デフォルトの名無しさん:2011/05/21(土) 19:12:23.27
>>519
let fun = flip map
[1..3] `func` (2*)

522 :デフォルトの名無しさん:2011/05/21(土) 19:15:15.50
`(flip map)`とかできないの?
ghcのドキュメントみても載ってなかった

523 :デフォルトの名無しさん:2011/05/21(土) 19:20:52.14
現在のHaskellでは無理

524 :デフォルトの名無しさん:2011/05/21(土) 19:26:04.35
部分適用したかったら、一度バインドする必要があるということでいいですか?

525 :デフォルトの名無しさん:2011/05/21(土) 19:35:17.81
はい

526 :デフォルトの名無しさん:2011/05/21(土) 19:42:09.26
>>524
バインドしなくても部分適用は出来るよ
確認したかったら、ghciで型を調べると良い
(値が無いので、値の表示はエラーになる)


527 :デフォルトの名無しさん:2011/05/21(土) 19:42:55.73
前にこういうのがHaskell Cafeで出てたな

infixr 0 -:, :-

data Pair a b = a :- b

(-:) :: b -> Pair (a -> b -> c) a -> c
x -:f:- y = f y x

main = print $ [1,2,3] -:map:- (+1)

528 :デフォルトの名無しさん:2011/05/21(土) 19:50:46.61
>>527
発想がステキ

529 :デフォルトの名無しさん:2011/05/21(土) 20:09:37.73
Haskell書くたび顔文字増えるね

530 :デフォルトの名無しさん:2011/05/21(土) 23:28:30.15
>>527
この場合、infix 0 っていうのは、何でですかね?
もっと、強い結合のほうが、使いやすくないですか?

531 :デフォルトの名無しさん:2011/05/22(日) 01:42:24.08
readFileとかって今でもUTF-8でするためにはutf8-stringを使わなきゃ駄目なんですか?

532 :デフォルトの名無しさん:2011/05/22(日) 04:52:49.51
>>530
俺も貼ってからそう思った

>>531
今のGHCだとreadFileは現在のロケールに従う(ただしWindowsだとマルチバイトは未対応のはず)
UTF-8を指定したければopenFile, hSetEncoding utf8, hGetContents

533 :デフォルトの名無しさん:2011/05/22(日) 07:34:41.09
C++のテンプレート特化に相当する機能無いの?
Map aでaがIntだった時自動的にIntMap使ってくれるみたいな

534 :デフォルトの名無しさん:2011/05/22(日) 08:22:59.17
>>533
なんで出来ないと思ったんだ?

535 :デフォルトの名無しさん:2011/05/22(日) 09:14:20.36
7.14.5 Specialisationかな

536 :デフォルトの名無しさん:2011/05/22(日) 09:24:20.74
あり^^

537 :デフォルトの名無しさん:2011/05/22(日) 10:18:53.61
しかし特殊化したい関数にRULESを付けるだけでなく
その呼び出し元にまでSPECIALIZEが必要

538 :デフォルトの名無しさん:2011/05/22(日) 10:27:37.85
面倒くさいのぅ

539 :デフォルトの名無しさん:2011/05/22(日) 11:11:05.06
>>537

>>535 を見ると、特殊化したい関数にRULESを付けるだけで、
呼び出し元については特に何も書かれていないように見えるんだが

540 :デフォルトの名無しさん:2011/05/22(日) 11:16:39.68
>>539
特殊化された方を呼ぶかどうかはコンパイル時に決まる

foo :: (Ord a) => a -> IO ()
intFoo :: Int -> IO ()
{-# RULES foo = intFoo #-}

bar :: Int -> IO ()
bar x = foo x -- xの型がIntだと分かっているのでintFooが呼ばれる

baz :: (Ord a) => a -> IO ()
baz x = foo x -- xの型がコンパイル時には不明なため、例え実行時にIntであってもfooが呼ばれる

541 :デフォルトの名無しさん:2011/05/22(日) 11:33:35.64
>>540
foo を直接呼出す baz の段階では x の型は確定しないけど、
ほとんどのケースで型推論によって Int かどうかはわかるんじゃないか?
実行時まで確定しないケースってどんなとき?

542 :デフォルトの名無しさん:2011/05/22(日) 11:49:03.72
>>540,541
「実行時」には型はかならず決定しているね。

でも、コンパイル時、つまりオブジェクトファイ生成時に不明であればfooが呼ばれてしまうというのはそのとおりだと思う。
Mapを多相なままさらにラップしなけりゃ発生しない問題であり、仮にラップしてもインライン展開されれば問題ないと思うが、そういうことを意識しないといけないのはスマートじゃないね。

543 :531:2011/05/22(日) 18:55:11.22
>>532
ありがとうございました。

544 :デフォルトの名無しさん:2011/05/22(日) 19:06:24.61
>>533
何がしたいのか知らんが、型宣言しとけば良いだけじゃないか?


545 :デフォルトの名無しさん:2011/05/22(日) 19:59:01.18
>>544
意味が分からん

546 :デフォルトの名無しさん:2011/05/22(日) 22:16:04.02
>>533
GHCならtype families拡張とか


547 :デフォルトの名無しさん:2011/05/23(月) 07:33:16.00
型族さんってそういうこともできるのか知らなかった

548 :デフォルトの名無しさん:2011/05/24(火) 00:24:34.30
一様初期化というか、

data Pt = Pt {x,y::Int}
v = [1,2]
p = Pt v!!0 v!!1

と同じことをやるイディオムってあるんですか?
配列のサイズが大きくなると大変だし、!!は使いたくない・・


549 :デフォルトの名無しさん:2011/05/24(火) 00:41:22.52
foldrっぽいんだけどなぁ・・・

550 :デフォルトの名無しさん:2011/05/24(火) 01:59:41.34
GTK+3になってからGDK関係で消滅した関数が大量にあるけど、gtk2hsはその辺どうなるんだろう。
まだGTK+2用だけどそのうち3にも対応するのかな。

551 :デフォルトの名無しさん:2011/05/24(火) 03:31:12.28
>>548
イディオムというほど手軽じゃないけど、Template Haskellを使えば、たぶんやりたいことができる。
参照: http://www.kotha.net/ghcguide_ja/latest/template-haskell.html

Main.hs:

{-# LANGUAGE TemplateHaskell #-}
module Main where
import Vector

vector 2 "Pt"
p :: Pt Int
p = fromList [1,2]

vector 10 "V10"
v :: V10 Char
v = fromList "abcdefghij"

main = do
 print p
 print v

(つづく)



552 :551:2011/05/24(火) 03:33:09.97
別ファイル Vector.hs:
module Vector where
import GHC.Show
import Language.Haskell.TH
import Language.Haskell.TH.Syntax
class Vector v where
 fromList :: [n] -> v n
vector :: Int -> String -> Q [Dec]
vector i name = do
 a <- newName "a"
 l <- newName "l"
 return [dataDec a, instanceDec l]
 where
  cn = mkName "Vector"
  tn = mkName name
  dn = tn
  fn = mkName "fromList"
  dataDec a =
   DataD [] tn [PlainTV a]
   [NormalC dn $ replicate i (NotStrict, VarT a)]
   [mkName "Show"]
  instanceDec l =
   InstanceD [] (AppT (ConT cn) (ConT tn))
   [FunD fn [Clause pats body []]]
   where
    pats = [VarP l]
    body = NormalB $ appE $ toInteger i
    appE 0 = ConE dn
    appE n =
     AppE (appE $ n - 1)
     (InfixE (Just $ VarE l) (VarE $ mkName "!!") (Just $ LitE $ IntegerL $ n - 1))


553 :デフォルトの名無しさん:2011/05/24(火) 06:36:17.68
この1/xの関数のグラフのような形のコード・・・
こういうのが並ぶとうねりコードになるんだよな
かといって圧縮すると一行が200文字コードになるし
この辺は仕方ないの?

554 :デフォルトの名無しさん:2011/05/24(火) 06:52:49.58
仕様です

555 :デフォルトの名無しさん:2011/05/24(火) 07:12:58.10
そりゃ仕様がないななんつってなガハハ

556 :デフォルトの名無しさん:2011/05/24(火) 07:55:58.94
ちょw
リストだからこれより簡単かと思ったのですが・・・
http://okmij.org/ftp/Haskell/polyvariadic.html#polyvar-comp

557 :デフォルトの名無しさん:2011/05/24(火) 07:59:23.40
リンク間違えた。
http://okmij.org/ftp/Haskell/polyvariadic.html#polyvar-fn
http://stackoverflow.com/questions/3467279/how-to-create-a-polyvariadic-haskell-function

558 :551:2011/05/24(火) 12:21:14.00
>>556-557>>551-552あて?

そういう方向でもちょっと検討したけど、採用しなかった。

理由は:
* 個人的にTemplate Haskellを試してみたかった
* printfとかそのsumOfは型定義は再帰的だけど、うまく型推論されて、実行時に型が決定されているようになっている(たぶん)。
 でも、リストを引数にすると、実行時までに型を決定することができなさそう(たぶん)。
* そのやり方でデータコンストラクタを作ると、実質リストを保持しているのと変わらないことになりそう。

最後の理由が一番大きい。

>>548の問題をそのやり方で解決したいならば、
newtype Pt = Pt [Int]
みたいに、リストをそのまま使えば十分でしょう、と。


なお、>>551-552はもっと読みやすくなる可能性はあるし、Language.Haskell.TH.Quoteの関数quoteDecを使えば大改善するかもしれん。

559 :デフォルトの名無しさん:2011/05/24(火) 21:15:12.73
C++で書かれたライブラリを使いたい場合ってもしかして一旦Cでラッパーライブラリ書いて、
DLLにして、それをさらにHaskellからリンクして使うことになる?

560 :デフォルトの名無しさん:2011/05/24(火) 21:34:23.30
うん
別にDLLにする必要はないが

561 :559:2011/05/24(火) 21:41:06.14
>>560
やっぱそうするしかないのか。
そうか……ありがとう。
C++へのバインドってどうやるんだろうと思ってqtHaskellのソース見てて驚いたんだ。

562 :デフォルトの名無しさん:2011/05/24(火) 21:44:13.03
>>559
もしくは C++ のクラスのオブジェクトを生成し、メンバ関数へのポインタを得て、
その関数へ第1引数としてクラスのオブジェクト、第2引数以降に実際の引数を渡せば、
とりあえずアクセスはできる

俺が試みたのは正確に言えば COM だが、これでアクセスできることは実験済み
(オブジェクトのメモリマップが仕様で確定しているから出来たのかも知れんが)

だが、これはこれでめんどい
そういうライブラリを一度作ってしまえばアクセスはそこそこ楽に出来るけど、
今度はIO地獄に陥る

563 :デフォルトの名無しさん:2011/05/24(火) 23:39:01.93
初心者の基本的な質問で申し訳ない。

funcA a >>= funcB >>= funcC

というような式を評価したとき、最初に呼ばれるbindにわたってくる引数の値は、
 引数1 (funcA a)を評価した結果のm a
 引数2 (funcB >>= funcC)という式(a -> m c)

と考えていいのでしょうか?それとも、
 引数2 (funcB)という式(a -> m b)

と考えるべきなのでしょうか?もしくは
 どっちと考えても一緒。なぜなら結合法則が一緒であることを保障してるから。
なのでしょうか?

何を見ても、このへんあんまりきっぱり書いてない気がするもので・・・・


564 :デフォルトの名無しさん:2011/05/24(火) 23:39:02.49
ps :: [FilePath] というリストをディレクトリとファイルに分けたい

(ds, fs) = partition doesDirectoryExist ps

もちろん、これはエラー(doesDirectoryExist の戻り値は IO Bool だから)

こういう場合、どうやるのがスマートなんだろ

565 :デフォルトの名無しさん:2011/05/25(水) 00:06:56.04
>>563
Haskell には、右結合性、左結合性、非結合性を指定できるという仕組みがあって、
それぞれ、infixr infixl infix という文字で指定できます。

Prelude でも確認できます。

Prelude> :info (>>=)
class Monad m where
(>>=) :: m a -> (a -> m b) -> m b
...
-- Defined in GHC.Base
infixl 1 >>=
Prelude> :info (=<<)
(=<<) :: Monad m => (a -> m b) -> m a -> m b
-- Defined in Control.Monad
infixr 1 =<<

詳しい内容は、検索でもしてください。

566 :デフォルトの名無しさん:2011/05/25(水) 00:10:04.87
>>563
> 引数2 (funcB >>= funcC)という式(a -> m c)
これはありえなくね?



567 :559:2011/05/25(水) 20:47:03.95
>>562
なるほど、両方試してみて、楽そうなほうにしてみる。
ありがとう。

568 :デフォルトの名無しさん:2011/05/25(水) 21:24:33.80
>>563
前者は誤り、後者は何を言いたいのかよくわからない
funcA a >>= funcB >>= funcCは
((funcA a) >>= funcB) >>= funcCと解釈するので
ひとつ目の>>=の第一引数は(funcA a),第二引数はfuncB
二つ目の>>=の第一引数は((funcA a) >>= funcB)の結果、第二引数はfuncC

結合法則が成り立つので前者のように考えても良いよね、という質問だとしたら
モナド則を全ての実装が満たしている保障はないので、そういう風に交換するのも無理
よく使うモナドはモナド側を満たしているだろうけどね

569 :デフォルトの名無しさん:2011/05/25(水) 21:38:57.70
HaskellでのGUI開発関連の最新の情報はどうなっているんでしょうか?
FRPはwxFruitもGrapefruitも開発が続いているようには見えないですが、他のFRPライブラリはどうなんでしょう?
また、FRP以外のパラダイムも研究されているんでしょうか?
あと、FRP関連の論文を少し読んでみましたが既存のパラダイム(例えばgtk2hsのようにモナド内でdoを使ってimperative的にする手法)
の欠点が指摘されているものが見つからなかったのですが、例えばgtk2hs的な手法の問題点はなんでしょうか?

って?ばっかりになってしまいましたが教えてください。

570 :uy:2011/05/25(水) 22:09:21.68
ゴミみたいな言語だしな・・・
こんなゴミみたいな言語でもdllは読めるんだろ?

だったら自分でCでGUIライブラリ書けよ・・・ゴミなんだからさ・・・・・・・

571 :デフォルトの名無しさん:2011/05/25(水) 23:34:05.48
>>569
まずFRPライブラリと、FRPを用いたGUIライブラリの混同に注意
FRPライブラリと言えば reactive や yampa のようなもの
FRPを用いたGUIライブラリと言えば wxFruit や Grapefruit のようなもの

GUIを記述する時にdoを使ってimperativeにする手法の問題点は、
たしか Fudgets ライブラリの論文で少し指摘されていたような気がする
どの論文だったかは忘れてしまった
(Conal Elliott が最初に FRP を提唱する以前のdeclarativeなGUIライブラリ)

ただ、imperativeだとHaskellらしくないよね、
Haskellらしくないとソースの見通しが悪いよね、という趣旨だったと思う

それ以外で明確に問題点(?)を指摘してる論文にはまだ出会っていない
偉い人はみんな、当然のようにdeclarativeなプログラムを目指している

だからこの問題はGUIに限らず、一般的にHaskellで
imperativeに記述する事の問題として考えてみることを勧める

個人的には、Haskellでimperativeに記述するとひどく読み難い
一つの関数の定義が縦に長くなるし、タブのネストが深くなりがち
確か、最適化も働きにくくなると、どこかのブログで読んだ気がする

572 :デフォルトの名無しさん:2011/05/25(水) 23:39:09.72
>>570
問題を勘違いしているのだと思うが、
GUIの基盤となるライブラリなら gtk2hs や wxHaskell など既にある


573 :デフォルトの名無しさん:2011/05/25(水) 23:42:14.99
一方、Haskell Committeeはストリームや継続による宣言的なI/O
をやめてモナド(do構文)に移行したのであった

574 :デフォルトの名無しさん:2011/05/25(水) 23:48:10.36
>>573
I/Oの表現方法としてストリームや継続を止めて
モナド(do構文)に移行した理由は何だろ?

冗談は抜きで真面目に

575 :563:2011/05/25(水) 23:55:43.08
>>568
明快なお答えありがとうございます。

Haskellがbindをどう展開しているかについて、なぜ引っかかっているかというと、
F#のワークフローに関する記述には、「bindの第二引数は、継続、つまり残りの処理全部」
と明確に書いてあったからなのです。つまり、F#ではbindは右結合で処理されるように
実装されているということです。

funcA a >>= funcB >>= funcC

(funcA a) >>= (\x -> funcB x >>= funcC)

これはこれで矛盾がないとも考えられます。ただし、結合法則が成り立つことが保障されて
いるという前提ですが。で、

>モナド則を全ての実装が満たしている保障はないので

ということがちょっとひっかかったのですが、そもそもモナドを名乗るためには、
bindの結合法則が成り立つことが大前提だと思っていたのですが。
↓ にも書いてあるので・・・・
http://www.sampou.org/haskell/a-a-monads/html/laws.html#laws
ここにある「正しいモナド」でないモナドもアリなのでしょうか?

「ナシ」なら、右結合でも左結合でも、どっちでも好きなように解釈していい、
ということになると思っているのですが・・・

576 :デフォルトの名無しさん:2011/05/26(木) 00:09:32.49
>>574
これの7章に書いてある。
http://research.microsoft.com/en-us/um/people/simonpj/papers/history-of-haskell/history.pdf
IO計算の概念が他の手法よりも優れた枠組みだったからということのようだ。

577 :デフォルトの名無しさん:2011/05/26(木) 00:10:22.97
ま、命令的に書く方がいいものもあるってことだ

578 :デフォルトの名無しさん:2011/05/26(木) 04:50:31.19
>>537
・継続渡しは決して宣言的に書ける訳じゃない(ストリームは知らん)
・そもそもこれに関して言語とライブラリは全然違う
 言語は宣言的な記述と命令的な記述を両方サポートしないと使い物にならない
 ライブラリはその問題領域において優れた記述方式だけをサポートすればいい

579 :デフォルトの名無しさん:2011/05/26(木) 07:00:08.55
>>575
>Haskellがbindをどう展開しているかについて、なぜ引っかかっているかというと、
>F#のワークフローに関する記述には、「bindの第二引数は、継続、つまり残りの処理全部」
>と明確に書いてあったからなのです。つまり、F#ではbindは右結合で処理されるように
>実装されているということです。

おそらく、「プログラミングF#」の「10.2 計算式ビルダー」の記述だと思うが、
その記述は defined {} がどう展開されるかの説明であって、
Haskell において >>= が右結合か左結合かという話とは全く関係がない。

Haskell において、F# の defined {} の展開に対応するものは、do 式になる。
以下を見てもらえばわかるが、F# と同様の展開が行われる。

do { x1 <- e1; x2 <- e2; e3 }
 ↓
e1 >>= (¥x1 -> e2 >>= (¥x2 -> e3))

580 :デフォルトの名無しさん:2011/05/26(木) 07:59:20.61
>>571
Haskellは命令的なコードも問題なく書けるようになってる
一般論として命令的に書くのが悪いなんてことはない
>一つの関数の定義が縦に長くなるし、タブのネストが深くなりがち
こんなのはお前のコーディング能力の問題

GUIで宣言的プログラミングの探求が盛んなのは、
そうした方が綺麗でモジュラー性が高いコードになるという感触があるからだろう
不用意に一般化してはいけない

581 :デフォルトの名無しさん:2011/05/26(木) 12:50:26.45
>>580
> こんなのはお前のコーディング能力の問題

「個人的には」から「深くなりがち」まで一文は
私の個人の能力に起因する私の個人的な感触を言ったまでなのに
そんな言い方はひどくないか

そうした方が綺麗でモジュラー性が高いコードになるという感触があるのは
GUIに特有の、GUIならではの性質なのか?

私は決してGUIだからでは無いと思っている
imperativeよりdeclarativeを目指しているのは分野ばかりではない
パーサー関連は昔からdeclarativeを目指してるし、
GUIに無関係にFRPはよりdeclarativeに向っている
HackageDBでいろんなライブラリを見てみれば分かるが、
できるだけdeclarativeにプログラムできるような仕組みを提供するものが多い

確かに何もかもdeclarativeに書くのが良い訳ではない
しかし、declarativeを目指してる分野は
「不用意に一般化してはいけない」と言うほど特殊でもない

582 :デフォルトの名無しさん:2011/05/26(木) 12:58:18.75
>581
FRPは状態とその関係性をよりdeclarativeに書くための仕組みだし、別にGUIに特有ではないと思うよ。
GUIが特殊というやつは正直いけぬまだと思われ。
GUIは各インスタンスが状態を持ちその状態がイベントにより遷移し連動するという側面が強く出ているだけでほかのプログラムも同様。
すべからく一般化すべき対象と思われ。

583 :デフォルトの名無しさん:2011/05/26(木) 13:58:34.13
すべからく見よ

584 :デフォルトの名無しさん:2011/05/26(木) 16:44:17.65
しばらくHaskell漬けになってたら、Cのライブラリとかでグローバル変数使ってる副作用バリバリのライブラリ見ると
一瞬ん??ってなるようになった。

585 :デフォルトの名無しさん:2011/05/26(木) 17:54:10.74
>>584
ああ……標準化されてるけどムダに副作用バリバリな関数使うかMS拡張だけど副作用のない関数使うか迷う

まあ大抵後者選ぶんだけど。標準化されててもクソなものはクソだわ

586 :デフォルトの名無しさん:2011/05/26(木) 17:58:43.56
>>584
久しぶりにCのプログラムすると、
関数の呼び出しでコンパイルエラー喰らって、
なんでエラーが出るのかしばらく悩む

587 :デフォルトの名無しさん:2011/05/26(木) 18:54:48.05
>>586
いくらなんでも、それは無い


588 :デフォルトの名無しさん:2011/05/26(木) 19:14:43.77
エラーメッセージが意味不明なのはC++くらい
それに比べたらHaskellもCも優しい

589 :デフォルトの名無しさん:2011/05/26(木) 21:50:22.59
do構文はa1 >>= (a2 >>= a3)と右にまとめるのに
a1 >>= a2 >>= a3とかくと
(a1 >>= a2) >>= a3と左にまとめるのか。

なんでどっちかに統一しなかったんだろう?
結合的でない>>=を書いたら、思わぬミスをしそう。

590 :デフォルトの名無しさん:2011/05/26(木) 22:04:28.28
>>589
よくわかってないから違ってるかも知れないんだけど、
そもそもモナド則を満たしてない似非モナド?が悪いんじゃないの?

591 :デフォルトの名無しさん:2011/05/26(木) 22:29:21.33
>>584
Haskellやった後にLISPを見ると手続き的な部分にイライラする

592 :563:2011/05/26(木) 23:57:36.88
>>579
ありがとうございます。自分が何をごっちゃにしていたかやっとわかってきました。
bindを直接書いて
funcA a >>= funcB >>= funcC
とすると、これは演算子を素朴につないでいるだけで、これはそのまま左結合で
処理されるが、
do記法にすると、右結合に展開されるのですね。
よくよく見ると、RWHの355Pに、do記法をどう展開するか書いてありましたね。

同じRWHの244Pに、
 〜do記法を使うか>>=を使うかはほとんど趣味の問題だが〜(中略)〜
 この二つのスタイルにはある重要な違いがあります。〜(引用終わり)
とある、この重要な違いというのが、右結合されるか左結合されるか、という
違いだったのですね。

 do記法だと、たとえばMaybeモナドで最初の式がNothingを返すと、二つ目
のbindは呼ばれないのに対し、>>=でつないだ場合は両方が呼ばれ、二つ目の
bindはNothingを入力しNothingを出力することとなります。
 この違いが、結合側を満たしているといえるのか、それともいえないのかは
微妙なところですが、traceなどの副作用を入れて観測しない限り結果は
同じになりますから、結合側は満たしていると考えるべきなのでしょう。
 
お付き合いくださってありがとうございました。勉強になりました。

593 :デフォルトの名無しさん:2011/05/27(金) 00:15:42.51
Haskellに足りないもの

それはscalaやerlangのようなメッセージパッシングのサポート
純粋であるというのはつらいことだね

594 :デフォルトの名無しさん:2011/05/27(金) 00:18:46.45
>>593
それってこういうやつ?

http://hackage.haskell.org/trac/ghc/wiki/ErlangInHaskell

595 :デフォルトの名無しさん:2011/05/27(金) 05:20:35.33
>>593
Control.Concurrent.Chan使おうぜ

596 :569:2011/05/28(土) 02:16:16.93
>>571
ありがとうございました。とても参考になりました。

597 :デフォルトの名無しさん:2011/05/28(土) 09:15:44.83
>>581
>そんな言い方はひどくないか
「個人的にはAだ」と言われたので、
「なるほど。でも普通はAじゃない」と返しただけ

現状手続き型言語が圧倒的に主流で、既存ライブラリの設計もそっちに激しく偏ってるから、
それを基準にすればHaskellライブラリの大半が宣言型を目指していることになる
しかしだからといって命令的プログラミングを軽視したり「Haskellらしくない」なんて罵倒するのは正当化されない
優れた宣言的手法が存在しない/知られていない分野なんていっぱいあって、
そういう場合は堂々と命令的に書くべきだし、それができるのがHaskellじゃないか

というかHaskellの命令的側面は軽視されすぎ
軽量スレッドのインタフェースは使い易いし、実装も優秀
低レベルのメモリ操作ができる一方でiterateeみたいな高レベルの抽象化も扱い易い
こんな言語はなかなかないと思う

598 :デフォルトの名無しさん:2011/05/28(土) 10:56:47.49
「優れた宣言的手法が存在しない/知られていない分野」ってどんなん?

599 :デフォルトの名無しさん:2011/05/28(土) 10:58:37.85
リアルタイム処理とか

600 :デフォルトの名無しさん:2011/05/28(土) 11:06:31.44
GUI

601 :デフォルトの名無しさん:2011/05/28(土) 11:42:19.75
割り込み

602 :デフォルトの名無しさん:2011/05/28(土) 13:35:59.57
>>597
GUIでは宣言的の方が綺麗でモジュラー性が高いコードになるという感触があると言う

一方で宣言的手法が存在しない分野もあると言う

両者の本質的な違いって何だろ
例えばこの分野には宣言的手法がありそうだと目星を付ける指針みたいなのってある?

603 :デフォルトの名無しさん:2011/05/28(土) 14:23:10.07
やってることが逐次的なものかどうかじゃね?

604 :デフォルトの名無しさん:2011/05/28(土) 14:32:06.85
システム側というかコード側以外にに実行トリガを委ねられるってことか?
となるとGUIとかはOKだけど、数値計算は…宣言的に書けるか…。

どこが割れ目かってことかね

605 :デフォルトの名無しさん:2011/05/28(土) 19:55:37.59
>>597
書いていることの大筋には共感するが、>>580は喧嘩腰すぎ(同一人物だよね)

>>604
> どこが割れ目かってことかね

えっちぃのはいけないと思います!


606 :デフォルトの名無しさん:2011/05/28(土) 21:15:54.80
XやWin32のイベントドリブンな枠組みは宣言的なのか?

607 :デフォルトの名無しさん:2011/05/28(土) 22:34:09.89
基本的な質問で恐縮ですが

import Data.Map (empty, insert, member)

f :: Int -> Int -> Bool
f x y = menber y $ insert x empty

g : Int -> Bool
g y = f 3

このように関数 f と g を定義した場合、
g 3 や g 5 などを評価する時に
毎回 insert 3 empty が評価されたりはしないですよね

608 :607:2011/05/28(土) 22:35:30.60
>>606
すいません、訂正です

誤 g y = f 3
正 g = f 3

609 :デフォルトの名無しさん:2011/05/28(土) 22:38:18.29
>>607
されないので、安心してくれ

610 :607:2011/05/28(土) 22:41:39.92
>>609
ですよね
ありがとうございます、安心しました

611 :デフォルトの名無しさん:2011/05/28(土) 22:50:26.49
>>607
処理系やコンパイルオプション依存で、再計算されても文句は言えない
実際GHC6.12.3で試したら毎回insertするコードが生成されたよ

612 :607:2011/05/28(土) 23:19:34.87
>>611
なんですと!?

f x y =
let s = insert x empty
in member y s

とか

f x = \y ->
let s = insert x empty
in member y s

とかでも毎回insertするコードが生成されるんですか

613 :デフォルトの名無しさん:2011/05/29(日) 02:13:41.21
>>612
GHC 7.0.2 で Debug.Trace 駆使して確認した限りでは、どちらも駄目
やるんならここまでやらんと

f x = let s = insert x 1 empty in ¥y -> member y s

614 :607:2011/05/29(日) 03:28:57.06
けっこう面倒で、ソースも見づらくなるのですね

最適化オプションで一度だけinsertするようなコードが生成されると期待しましたが…

615 :デフォルトの名無しさん:2011/05/29(日) 06:23:36.87
>>614
それは(\x -> let y = e in f)を(let y = e in \x -> f)に変換する最適化で、
full-laziness変換と呼ばれてるが、副作用があるから常には適用されない
特に(\x y -> let y = e in f)を二つの1変数関数(\x -> let y = e in \y -> f)にすることはないはず

616 :デフォルトの名無しさん:2011/05/29(日) 06:25:54.87
(規制のため分割)
詳細は「Let-floating: moving bindings to give faster programs」

ソースが見づらくなる問題については、where節を使うと良いと思う
f x = \y -> member y s
  where s = insert x 1 empty

617 :デフォルトの名無しさん:2011/05/29(日) 12:53:37.51
ハスケルたんのことが大好きすぎてWEBアプリ分野でscalaを倒してほしい

618 :デフォルトの名無しさん:2011/05/29(日) 13:02:50.22
twitterを超えるwebアプリをHaskellで書いてくれ

619 :デフォルトの名無しさん:2011/05/29(日) 16:37:37.99
JVM上でhaskellが動いたら勝機も見えてくる!

620 :デフォルトの名無しさん:2011/05/29(日) 17:56:30.08
>>619
研究はされてる

"Compiling Lazy Functional Programs Based on the Spineless Tagless G-Machine for the Java Virtual Machine"
"The Architecture of the Utrecht Haskell Compiler"
など

621 :デフォルトの名無しさん:2011/05/29(日) 18:19:38.46
Lispですらまともに実装できてないというのに…

622 :デフォルトの名無しさん:2011/05/30(月) 00:21:19.09
待ちたまえ
Lispの方が実装し易いと言いたいのかね?

623 :デフォルトの名無しさん:2011/05/30(月) 22:51:48.59
1週間前からhaskell弄り始めた。なんとなく文法覚えた程度でモナドとかはまだだけど、なんか楽しいね
数式っぽく書けるのが気持ちいい♬

624 :デフォルトの名無しさん:2011/05/31(火) 01:17:58.36
>>623
welcome !

625 :デフォルトの名無しさん:2011/06/01(水) 14:27:55.86
圏論が勉強してないから気持ち悪くて使う気しないのは俺だけ?

626 :デフォルトの名無しさん:2011/06/01(水) 15:35:30.84
ベテラン先輩Haskellerとして一言、圏論関係ない

627 :デフォルトの名無しさん:2011/06/01(水) 17:03:45.27
囲碁将棋ジャーナルでハスケル将棋ってやつがコンピューター将棋大会に出場してたけど
これで作ったんだろうね。

628 :デフォルトの名無しさん:2011/06/01(水) 19:23:32.03
cabal でインストールしたパッケージのドキュメントを
アンインストールする方法は無いでしょうか

ドキュメントをインストールすると、今までのドキュメントに
インストールしたパッケージのドキュメントが融合されますが、
それを全て融合前の状態に戻したいです

あと、パッケージは既にインストールされているところへ、
ドキュメントだけをインストールしたい場合、
cabal ではどのようにオプションなどを設定するのでしょうか

629 :Perl忍者:2011/06/04(土) 23:09:39.33
みなさんあいかわらずですねあ、かわいそう

630 :Perl忍者:2011/06/04(土) 23:22:40.48
あれ???

631 :Perl忍者:2011/06/04(土) 23:24:51.48
ああああああああああああああああああああああああああああああああああああああああああああああああああ

632 :デフォルトの名無しさん:2011/06/05(日) 02:06:08.66
quickCheckの型は (Testable a)=> a -> IO()なんですけど、
instance Testable ()
instance Testable Result
instance Testable Property
instance Testable Bool
なのに、Integer -> Bool の関数が quickCheckの引数にできる理由が分かりません


633 :デフォルトの名無しさん:2011/06/05(日) 02:43:15.19
instance (Arbitrary a, Show a, Testable b) => Testable (a -> b)

634 :デフォルトの名無しさん:2011/06/05(日) 13:06:08.79
本物のプログラマはHaskellを使うがやっと更新した

635 :デフォルトの名無しさん:2011/06/05(日) 13:15:31.44
>>634
それは朗報!
GJ


636 :デフォルトの名無しさん:2011/06/05(日) 21:11:47.34
>>634
キター!

でも、非正格評価から正格評価に代えたらそれまで問題のなかったところで例外が発生するようになる、ということについてすごく注意を促しているけども、それってそんなに気にするようなこと?
いくらかでも役に立つ関数で、そういうことが起こることが想像しにくいんだが。

637 :デフォルトの名無しさん:2011/06/06(月) 21:01:56.31
実用的なプログラムだと、!を多用する感じなのだろうか

638 :デフォルトの名無しさん:2011/06/10(金) 14:39:26.13
そんなことはない!!!!!

639 :デフォルトの名無しさん:2011/06/10(金) 15:20:31.62
>>637
単純にhaskellの記事が少ないからだが


640 :デフォルトの名無しさん:2011/06/10(金) 21:33:04.35
記事というか、xmonadのソース(短い)を見るとそんな感じだったのでそう思った
先に引数評価するほうが速くなるのは多くのケースで真でしょ?
実用と一口にいっても速度を求められない場面があるのはわかってるが
速いに越したことはないし、末尾再起の展開だってされるし

641 :デフォルトの名無しさん:2011/06/11(土) 16:10:39.24
>>640
xmonadのソースはリストを配列みたいにして使ってるし全然洗練されていない印象。
一見して何かを移植した感じだね。

642 :tokuhirom:2011/06/11(土) 17:33:52.52
Haskellって・・・w
僕よりプログラミングできないやつが何言ってんだか

643 :デフォルトの名無しさん:2011/06/11(土) 17:57:59.13
何だかんだいって古いからなぁ
ワークスペースと窓のスタックを選択するのにZipper使ってる所ぐらい?

644 :デフォルトの名無しさん:2011/06/11(土) 18:15:54.24
効率が問題にならない場面なら「何でもリスト」でおk

645 :デフォルトの名無しさん:2011/06/11(土) 18:22:21.09
xmonadのソース見てみたけど別に洗練されてない印象はないな
リストを配列みたいに使ってるところってどこだろう

646 :デフォルトの名無しさん:2011/06/11(土) 18:23:50.08
リストの便利さは異常
String が [Char] ってのはよくできてる

647 :デフォルトの名無しさん:2011/06/11(土) 18:33:37.63
List的な操作はListLikeクラスとして提供して
デフォルトでBytestringにしてもいいぐらい

648 :デフォルトの名無しさん:2011/06/11(土) 18:36:25.76
xmonadは何より実行時に落とさないための配慮が凄まじい
Haskellの型安全性を遺憾なく発揮している

とliftM2を理解できない私は思うのでした。まる

649 :デフォルトの名無しさん:2011/06/11(土) 19:07:31.83
>>648
liftM2 (++) ["a","b","c"] ["d","e","f"]

650 :デフォルトの名無しさん:2011/06/11(土) 19:08:18.44
["ad","ae","af","bd","be","bf","cd","ce","cf"]

651 :デフォルトの名無しさん:2011/06/11(土) 20:14:32.92
>>649-650
コードありがとう。これでliftM2はなんとかなりそう

xmonadの設定でこんな感じに使われてました。難しい
viewShift = doF . liftM2 (.) W.greedyView W.shift

652 :デフォルトの名無しさん:2011/06/11(土) 22:02:47.00
なんかcurry app == idっぽいのに気づいたんだけどこれどうやって証明するの
あと他にもcurryとapp使った性質あったら教えてちょうだい
とりあえずfirst (curry f) >>> app == f以外で

653 :652:2011/06/11(土) 22:14:02.35
curryとappの圏論における定義をhaskellっぽく書くと

class Arrow :->: => Exponent (:->:) where
type :^: : * -> * -> *
curry : (c,a) :->: b -> b :^: a
app : (b :^: a, a) :->: b

こんな感じ?
>>652の3行目の性質だけ定められてる
それとarrow則、Category則?を使ってcurry app == idが証明できるっぽいんだけど
なんか適当に変形していった限り際限なくcurry appの入れ子が増えるだけなんだよね

654 :652:2011/06/11(土) 22:21:19.53
まぁArrow ->での定義を使うと

app (f,x) = f x
curry f x y = f(x,y)

(curry app) id x =
app (id,x) =
id x

ってな感じで自明?なんだけどこれを使わずにarrow則とかだけでやると・・・って話ね

655 :デフォルトの名無しさん:2011/06/12(日) 03:48:15.16
ArrowAplly の話なら curry app == id は証明すべきものではなくてそうなっているものを ArrowApply にしていいよということじゃないのかな。
参考:「関数プログラミングの楽しみ」第10章 日本語訳版p.223

656 :デフォルトの名無しさん:2011/06/13(月) 01:00:20.65
Arrow則で定められてるのはfirst (curry g) >>> app == gですね。
これを仮定して証明を頑張ってたんですが、結局できませんでした。
そもそもcurry app f == fとしても***も&&&もないんだからどうしようもない。
こんだけ頑張ってもできないんだから多分無理なんだろう、でも一度haskell-ircあたりで質問してみるか意やその前にircとMLの過去ログ検索するべきか。

curryはArrowAppの定義に含まれてなくてベタでラムダ式書いた形の文献が多かったです。
curry appがidになるのはArrow (->)における実装依存なのかなぁ
そういやPrelude.curryもArrow (->)専用なんだよね

657 :デフォルトの名無しさん:2011/06/13(月) 03:19:16.26
「関数プログラミングの楽しみ」第10章では ArrowApply の curry は
curryA f b = mkPair b >>> f
mkPair b = arr (\c -> (b,c))
となってます。

658 :デフォルトの名無しさん:2011/06/13(月) 03:53:55.64
ついでに書くと app には満たすべき3つの条件があって
arr ((>>>h) ☓ id) >>> app == app >>> h
arr (mkPair ☓ id) >>> app = arr id
mkPair f >>> app = f


659 :デフォルトの名無しさん:2011/06/13(月) 22:25:24.89
cabal で glfw をインストールしようとしましたが、
途中で止まってしまいます

cabal install -v3 glfw

でインストールを開始したところ、
Graphics\UI\GLFW.hs のコンパイル中に
GLFW_stub.c の gcc によるコンパイルで止まってます

OpenGL-2.4.0.1 はインストールされており、
system32 ディレクトリには GLFW.dll もあります
(管理者権限でコマンドプロンプトを立ち上げてます)

他に足らないものは何かあるでしょうか

660 :659:2011/06/13(月) 22:26:42.25
>>659
環境を書き忘れてました

Haskell Platform 2011.2.0.1
Windows7

661 :659:2011/06/13(月) 22:39:56.58
>>659
追加情報

止まったところで [Ctrl + C] キーで強制的に終了させたら、

cabal: permission denied

と表示されましたが、何か関係あるでしょうか

662 :デフォルトの名無しさん:2011/06/15(水) 23:17:43.86
誰も答えないので大変でしょうが頑張ってね。
僕もwindowsで触ってないしわからないのよ。

ここの多くの人って、脳みそがモナド、血液が関数でできていることを忘れずに。
7.0.4がでたので早速インストールしたhaskell platformも2月版で利用してみる。

663 :デフォルトの名無しさん:2011/06/16(木) 12:20:29.54
どうしても出来なかったらVM入れて、linux上でやるとか・・・

664 :デフォルトの名無しさん:2011/06/16(木) 13:19:49.44
>>659
windowsでhaskell使おうとするといろんなところで苦労するよ。
俺もwindowsでhaskell使ってたら問題がでて、
原因が分からず、解決するのに3日以上かかることが度々あった。
だから、もう今ではLinux上でしか使わないようになった。

665 :デフォルトの名無しさん:2011/06/18(土) 08:57:11.91
>>659
cabalは結構不安定というか動作が謎いので、自分はあんまり使ってない。専らソース落して手動Setup.hs。linux上だとまた違うのかもしれないけど。
stub_cで止まるならばSetup.hsの前にconfigureを走らせる必要があるかもしれない。
あとはgccのincludeのpathとかかなあ。

666 :デフォルトの名無しさん:2011/06/18(土) 10:45:48.18
http://snapframework.com/about

667 :デフォルトの名無しさん:2011/06/18(土) 11:15:55.23
pacman最強

668 :デフォルトの名無しさん:2011/06/18(土) 12:53:46.44
不安定というかライブラリがcのコード含んでるときに、そのconfigure段階で死んだりすると
何が原因かよくわからんから、そういう時は.cabal/package以下にもぐるとそのソースのアーカイブを見つけられるから
それを解答して手動でSetup.hsっていうフォールバックを行うってとこか
そういう定型操作をある程度自動化するスクリプトとか書くといいかもな
でも基本的にcabal使う
Yiの必要パッケージを揃える為に手動で落としてとかやってられんもん

まぁライブラリによっては自分でPACKAGENAME.cabalとかコードの一部を修正しないと入らないなのもあるんだけどね・・・

669 :659:2011/06/18(土) 13:55:24.72
みなさん、ありがとうございます

あれからアドバイスを受けていろいろ試しましたが、
昨日まで全く進展無く、同じところで止まっていました

で、今日 PC を立ち上げた直後に "cabal install glfw" したら、
なぜかインストールできてしまいました

理由は全く不明、俺には理解不能で、説明もうまくできません
昨日と今日で俺の周りの世界がガラッと変わってしまったかのようです
なんか怖い

でもまぁインストールできたのだから、とりあえず先に進みますが、
今後この世界が俺の記憶と違うようだと感じたら、
今日の未明に世界がおかしくなったのだと思うことにします

670 :デフォルトの名無しさん:2011/06/18(土) 16:16:49.55
異常なほど眠かったので、寝て起きてみたら意味が変わっていたとかか。

671 :デフォルトの名無しさん:2011/06/18(土) 16:27:31.99
Haske る? それともお風呂?

672 :デフォルトの名無しさん:2011/06/18(土) 16:54:59.29
「それとも、マッ・カー・シー?」

そういいながらジョーンズ(仮名)は淫らにほほえんだ
長い夜はまだ幕を開けたばかりだ

673 :Perl忍者:2011/06/18(土) 19:11:13.93
みんなこれフォロー
http://d.hatena.ne.jp/sugyan/20110616/1308203734

ここに乗ってるのフォローしてくださいお願いします

お願いですHaskellのみなさんおねがいで
お願いですフォローしてください
フォロー

674 :デフォルトの名無しさん:2011/06/18(土) 21:18:27.83
インストールしたときのプラットフォームだけでなんとかなるようにしてほしい

675 :Perl忍者:2011/06/18(土) 21:35:14.16
おねがいです

今すぐフォローすべきPerl界のスーパーエンジニア
http://d.hatena.ne.jp/sugyan/20110616/1308203734

676 :デフォルトの名無しさん:2011/06/19(日) 11:56:55.91
フォローってなに
崇拝しろってこと?

677 :デフォルトの名無しさん:2011/06/19(日) 12:54:26.16
Twitterの話じゃないのか

678 :デフォルトの名無しさん:2011/06/20(月) 08:50:10.69
例えば3バイトの型を定義したい場合は
Data.Wordの配列とするのは普通のやり方でしょうか?
Byteみたいな基本型はないしCharはutf8が表現できるサイズみたいですし

679 :デフォルトの名無しさん:2011/06/20(月) 14:11:12.83
Word8とかInt8とかあるよ。

680 :デフォルトの名無しさん:2011/06/20(月) 19:17:24.92
ありがとうございます。Word8を使ってみようと思います
それにしても、配列は選択肢が多すぎて辛い
Array/IArray/MArray/IOArray/STArray/DiffArrayと、これらのUnboxed版
GHC拡張の並列版に、参考にしようと中身を少しだけ眺めれば
ByteStringにはまた別のMarshall版の配列が使われている
どうしてこうなった・・何を信じたらよいの

681 :659:2011/06/20(月) 19:50:06.12
>>680
それぞれの違いを学んで適切に使い分ければいいだけだよ

http://en.wikibooks.org/wiki/Haskell/Hierarchical_libraries/Arrays
おれは興味が沸かず学んでないんで分からんが

> 何を信じたらよいの

証明済みの定理

682 :デフォルトの名無しさん:2011/06/20(月) 20:30:42.47
Word単位で扱うならやっぱMarshalになるんじゃないのかな
でも基本vectorでいいと思うけどな、どうしても性能が気になるのならMarshallでガンガンいく感じ
それ以外の中途なものは最初は無視でいいと思う

683 :デフォルトの名無しさん:2011/06/20(月) 20:36:07.85
Java のコンテナクラスみたいに共通インタフェースがあって
用途に応じて交換できるようになってれば理想だが…
Haskell の改善点のひとつだよね。

684 :デフォルトの名無しさん:2011/06/20(月) 21:33:28.70
一応functional lensesとか使ってで抽象化でできないこともないけど

685 :デフォルトの名無しさん:2011/06/22(水) 23:42:15.05
「なぜ関数型言語は普及しないか - id:morchin」
http://d.hatena.ne.jp/morchin/20110614#p1

686 :デフォルトの名無しさん:2011/06/23(木) 01:39:06.20
>>685
> 「なぜ関数型言語は普及しないか - id:morchin」
> http://d.hatena.ne.jp/morchin/20110614#p1

このブログの書き手には関数型言語は永遠に無理だろうな
自分にとって新しい言語パラダイムを学んで使えるようになるための発想が根本的に間違ってる

687 :デフォルトの名無しさん:2011/06/23(木) 01:47:49.49
今comprehending monads読んでんだけど
Law(4)の証明の仕方がよくわからん
[ft|q]のqのところの取り扱いがよくわからん

688 :デフォルトの名無しさん:2011/06/23(木) 02:33:01.71
手続き型言語脳

689 :デフォルトの名無しさん:2011/06/23(木) 05:29:45.03
>>687
q := x<-u
t := t(x)

[f t|q] == { unfold q, t} == [f (t(x)) | x<-u] == { law 2 } == map (\x -> f(t(x))) u == { map . map fusion } == map f (map (\x -> t(x)) u
== { <- law 2 } == map f [t(x)| x<-u] == { fold q,t] == map f [t|q]

こう?
文章の説明以外にbnf形式での構文定義も載せといて欲しいよなぁ・・・

690 :デフォルトの名無しさん:2011/06/23(木) 07:53:05.73
>>685
> 「なぜ関数型言語は普及しないか - id:morchin」
> http://d.hatena.ne.jp/morchin/20110614#p1

これはwww 黒歴史すぐるwww

691 :デフォルトの名無しさん:2011/06/23(木) 10:56:15.98
>>685
う〜ん、もうちょっと勉強してから関数型言語のブログを書いて欲しいかな。

692 :659:2011/06/23(木) 12:47:47.73
Data.Functor.fmap 関数のシノニムとして <$> 演算子が
Data.Functor や Control.Applicative で定義されているように
Data.Monoid.mappend のシノニムとしての演算子はどこかに定義されていないでしょうか

標準ライブラリの中にという意味です

693 :デフォルトの名無しさん:2011/06/23(木) 15:58:28.37
http://www.haskell.org/hoogle/?hoogle=Monoid+a+%3D%3E+a+-%3E+a+-%3E+a
これ見る限り無いんじゃ?

694 :659:2011/06/23(木) 19:25:02.82
>>693
参考になりました
ありがとうございます

695 :デフォルトの名無しさん:2011/06/24(金) 08:54:33.61
RT osiire: Functional Programming Meetingは仮のタイトルでしたが、昨日「函数プログラミングの集い」に正式に決まりました。よろしくお願いします。http://t.co/Uo0N61m #fpm2011

696 :デフォルトの名無しさん:2011/06/24(金) 09:02:09.79
>>695 人の集いじゃないのかよwwww

697 :デフォルトの名無しさん:2011/06/24(金) 09:16:12.26
プログラミングから人への射影関数がどうたら

698 :デフォルトの名無しさん:2011/06/24(金) 13:49:20.18
http://d.hatena.ne.jp/morchin/20110621#p1

699 :デフォルトの名無しさん:2011/06/24(金) 14:55:51.26
物質世界からアイデアを得て考え出されたオブジェクト指向言語と、
抽象的な数学世界からアイデアを得て考え出された関数型言語では
そもそも思考の対象が違う。

700 :デフォルトの名無しさん:2011/06/24(金) 14:57:11.89
オブジェクト指向はアホでもわかるように作られた
関数型はバグを減らしたり、高度な抽象化を目指して作られた

701 :デフォルトの名無しさん:2011/06/24(金) 16:15:00.62
ガベコレっていつ行われるの?

メモリ24GB積んでたとしても取り敢えずあればあるだけ使おうとするの?
デブにおやつなの?

702 :デフォルトの名無しさん:2011/06/24(金) 18:40:53.46
>>701
ヒープ領域(/=搭載メモリ総量)が尽きるたびに発生する
たくさんメモリを使うプログラムだと、ヒープ領域がだんだん大きくなる

703 :デフォルトの名無しさん:2011/06/24(金) 18:45:03.64
>>702
あり^^

704 :デフォルトの名無しさん:2011/06/24(金) 21:09:25.71
>>700
理想はな...

現実は云々

705 :デフォルトの名無しさん:2011/06/24(金) 21:58:19.74
まえになんかのプログラムを作って動かしたら、swap領域まで食いつぶされたことがあった。
笑 合計8G

706 :デフォルトの名無しさん:2011/06/24(金) 22:15:25.22
数値計算のニュートン法をそのまま実装したらメモリフローしちゃったんですけど、どうにかならないでしょうか?

707 :デフォルトの名無しさん:2011/06/24(金) 22:29:28.47
>>706
理論上フローするはずがないと思って実装したのなら、
どこがでスペースリークしている

まずは場所を特定せよ
http://itpro.nikkeibp.co.jp/article/COLUMN/20110308/358081/?ST=ittrend

708 :デフォルトの名無しさん:2011/06/24(金) 22:38:10.70
while(hantei(x)) { x = f(x); }

C言語だと↑こんな感じ

709 :デフォルトの名無しさん:2011/06/24(金) 23:20:02.04
foldl'使えばいいと思うよ

710 :デフォルトの名無しさん:2011/06/24(金) 23:20:47.01
もしくはseq

711 :デフォルトの名無しさん:2011/06/24(金) 23:28:18.36
スワップに及ぶくらいなら今すぐガベコレせよ
って指令はできないの?

712 :デフォルトの名無しさん:2011/06/24(金) 23:46:09.85
GCは不要なデータ、もっと正確に言えば参照されなくなったメモリ領域は再利用するが
不要な参照が残るようなコードを書かれたらヒープを拡張するか投げ出すしかなくなる

713 :デフォルトの名無しさん:2011/06/24(金) 23:57:29.49
>>708
aとeが脳内で入れ替わった

714 :デフォルトの名無しさん:2011/06/25(土) 00:09:55.23
bukkake(x)

715 :デフォルトの名無しさん:2011/06/25(土) 14:29:07.98
ハスプラにvector標準搭載しといてくれよ

716 :デフォルトの名無しさん:2011/06/25(土) 14:51:03.33
vectorとrepaでblasとlapackってないのかな?
FFI使ってるのならあるけど
vectorとrepaには期待している

717 :デフォルトの名無しさん:2011/06/25(土) 21:54:37.99
>>698
だから、関数型言語を挫折したまま語るなよ
両方一応でも覚えたって実感したら、むしろ関数型言語の方が簡単に覚えられるって気付くから
プログラミングhaskellの半分以上は対話プログラムとか、切符番号遊びとか、具体的なプログラム作りだぞ
基本文法覚えるだけなら、あの薄さのさらに半分で済む
手続き型言語の入門書の厚さの割に基本文法覚えるだけの内容のなんと多い事か。。。


718 :デフォルトの名無しさん:2011/06/25(土) 22:26:19.89
Hentai 言語 Haskell

719 :デフォルトの名無しさん:2011/06/25(土) 23:43:42.56
プログラミングに一度も触れたことのないような何も知らない人に勉強させるときに
手続き型と関数型のどっちが良いのだろうかと考えることはある

720 :デフォルトの名無しさん:2011/06/25(土) 23:46:10.85
考えるまもなく手続き型のC言語に決まってるだろうが。
ノイマン型コンピュータ使ってんだろうが。

721 :デフォルトの名無しさん:2011/06/26(日) 00:08:16.02
>>719
文法覚えるだけなら関数型の方がすぐ覚えられそう。
だけど、文法覚えてから何か作るなら手続き型の方がすんなり作れると思う。

722 :デフォルトの名無しさん:2011/06/26(日) 00:14:37.32
機械語がわかってて、これからプログラミング言語習います、なんて人は普通ごくわずかだと思うがね。

723 :デフォルトの名無しさん:2011/06/26(日) 00:30:07.39
>>719
自分は関数型言語だと思う

特にswap関数は手続き型ではtemp変数が必要なのか、初心者は理解が難しい
(スコープによっては(=大抵は)アドレスも意識する必要出てくるし)

この辺は、関数型言語の方がそのまま位置を交換出来る
(変数の値ではなく、数列などの順番である事に注意)




724 :デフォルトの名無しさん:2011/06/26(日) 00:33:24.29
>>721
それは単にライブラリの充実度の差で、手続き型か、関数型かの差では無いと思う


725 :デフォルトの名無しさん:2011/06/26(日) 00:36:18.74
>>723
数列の非常に離れた要素同士の置換も、関数型言語の方が分かりやすいのか?

726 :デフォルトの名無しさん:2011/06/26(日) 00:39:34.79
>>725
分かりやすいよ


727 :デフォルトの名無しさん:2011/06/26(日) 00:46:37.63
明日情報セキュ試験受けるんだけど、
参考書読んでたら試験内容が洗脳臭くてワラタ

728 :デフォルトの名無しさん:2011/06/26(日) 01:05:20.67
>>726
もしよければ例示してみてくれないだうか

どうも「特にswap関数は手続き型ではtemp変数が必要なのか、初心者は理解が難しい」
というのがイメージしにくい

必要に決まっているという思いが私の中にあるから、
これよりもっと分かりやすい関数型による離れた要素どうしの置換があるというのは
にわかには信じられない

729 :デフォルトの名無しさん:2011/06/26(日) 01:18:52.05
>>728
リストの最初と最後を交換する関数

FirstLast (n:ns) = (last ns) ++ (tail ns) ++ [n]


3つ組の数列(タプルにするけど、固定長なら基本的にリストでも同じ)の先頭と最後を交換する関数

triple (x,y,z) = (z,y,x)

何番目と何番目を交換するとかは、どういうパターン(ここでは性質の事とする)で交換するのかを考えて記述していく


730 :デフォルトの名無しさん:2011/06/26(日) 01:28:39.09
リストの最初と最後を交換する関数
FirstLast (n:ns) = (last ns) ++ (tail ns) ++ [n]

これ本当に手続き型に比べて初心者がより理解しやすいものなってるのかな

例えばC言語なら次のように書ける

tmp = xs[0]
xs[0] = xs[最後]
xs[最後] = tmp

理解しやすさの度合いは、どちらも大して違いはないように思える

それどころか、これなら何番目と何番目を交換するという場合も
同じ考え方でいける

731 :デフォルトの名無しさん:2011/06/26(日) 01:41:56.52
>>730
初心者はまず
xs[0]=xs[最後]ってやっちゃう(経験談)
理解力あれば、すぐにtempを使う理由分かるけど、分からん人はトコトン分からん

あと、Cだと確か
xs[最後] = xs[(sizeof(xs)/sizeof(xsの型))]
だったと思う
(文字列ならstrlenで済むけど)



732 :デフォルトの名無しさん:2011/06/26(日) 01:52:38.77
本当にトリビアルですがtailではなくinitでは?

733 :デフォルトの名無しさん:2011/06/26(日) 01:59:54.55
>>731
> 初心者はまず xs[0]=xs[最後]ってやっちゃう

やっちゃうことの問題点が分からない
初心者はやっちゃっていいでしょ

それでは望む結果が得られない「理由」を教え解決へ導くのは教える側の役割だよ

それとも、教える側も、「理由」を理解させることが容易ではないという事?

ちなみに、last ns はリストではないから、そのままでは ++ で繋げられないのだが、
それを理解させるよりも難しいという事?

734 :デフォルトの名無しさん:2011/06/26(日) 02:42:37.38
>>728-733
リストと配列という特性が全然違うデータ構造でのswapを比較して言語の優劣を議論してる時点で全員論外というか何も理解してないのが丸分かり。
リストは伸縮は自在だが要素のアクセスに関してリスト長Lに比例するO(L)時間が必要、配列は伸縮は困難だが要素アクセスはO(1)時間。
こんなに違うものについての「要素の交換」を同じ土俵の上だと思って比較して関数型と手続き型の優劣を議論するのは何もわかってない証拠。

手続き型の配列に相当するものは関数型言語では定義域が有限区間の写像であってリストじゃない。
逆に関数型でのリストに相当する手続き型でのデータ構造は構造体とポインタで作る普通の一方向リストだ。

手続き型プログラミング言語で一方向リストの先頭要素と最終要素をやるには、Haskellでのlastやinitや++に相当する関数を
先ず自分で再帰的に定義すれば交換そのものは729のHaskellでのとほぼ同じ書き方になる。
(C言語だとinfix operatorは自分で定義できないからHaskellでの++はCでは普通の関数呼び出しになり見た目は綺麗じゃないが本質的な問題じゃない)


735 :デフォルトの名無しさん:2011/06/26(日) 03:05:33.44
そういやC++標準ライブラリに一方向リストって無いな
なんでだろ

736 :デフォルトの名無しさん:2011/06/26(日) 05:22:04.71
初心者にCだけはありえんなあ
プログラミングの本質から外れた罠が多すぎる
あの言語じゃアルゴリズム覚える前に意味不明な(多くは意識せず使われているポインタ絡みの)エラーに悩まされることになる
まだJavaのがマシかと

737 :デフォルトの名無しさん:2011/06/26(日) 05:46:04.44
同感だな
10〜15年前とは状況が違う

738 :デフォルトの名無しさん:2011/06/26(日) 05:59:54.28
高級アセンブラと言われるし、プログラミングの本質よかも計算機の本質じゃね?
アルゴリズム+データ構造を本質とするなら、
S式から木構造を理解しやすいschemeを推すけど
やりたいことを実現するために便利な言語がpythonだったとしても、
Javaが基本だとか考えられない
hello worldだけでも、
public static void main(String[] args){System.out.println(); return;}
int main(int argc, char* argv){ printf("hello world\n"); return 0;}

739 :デフォルトの名無しさん:2011/06/26(日) 06:34:01.06
リストxsのi番目とj番目の要素を入れ替えたリストを返す関数って、意外と書きにくいな。

swap xs i j =
if i < j then take i xs ++ [xs !! j] ++ (take (j-i) (drop (i+1) xs)) ++ [xs !! i] ++ drop j xs
else if i == j then xs
else swap xs j i

効率を無視すればこれが素直か。

740 :デフォルトの名無しさん:2011/06/26(日) 07:34:02.45
こんなんでどうか

swap xs i j = map f (zip [0..] xs)
where
f (idx,e) | idx == i = xs !! j
| idx == j = xs !! i
| otherwise = e


741 :デフォルトの名無しさん:2011/06/26(日) 09:38:45.60
>>736
まずはAwkがいいよ

742 :デフォルトの名無しさん:2011/06/26(日) 11:09:32.22
>>734
配列が伸縮困難というのは嘘
はじめから要素数を必要以上に確保しておいて、ただ単に最大要素の添え字Nを変えればいいだけの話

743 :デフォルトの名無しさん:2011/06/26(日) 11:37:08.30
Cを覚えろってのは計算機が具体的に何をしているのか理解しろってこととほぼ同義だし、
コンピュータを勉強するなら基礎教養としてある程度はCを齧っとけっていうのは正しい。
Cを使っててこりゃ面倒だ、と感じたものが他の高級言語でどう解決されるのかを知るのは良いことだ。

ただ、Cだとアルゴリズムに特化できない諸々の事情があるし、
lispみたいに簡単にそういう面倒事をラッピングできる機能もない。
再帰アルゴリズムとかCでやるにはちょいと苦痛。
置換モデルがつかえる言語じゃないと、少なくとも俺は再帰が理解できなかった。

個人的にはHaskellも、ちょっと面倒。純粋関数言語はどうも潔癖すぎる気がしてしょうがない。
今まで実行時エラーにでくわしたことがないのはちょっとした脅威だけど。

744 :デフォルトの名無しさん:2011/06/26(日) 11:52:51.58
>>734
全くその通りで、言ってること自体には何の反論もないが
なんか論点が違うような気がする

>>723>>725(私)も、>>719 の通り
「プログラミングに一度も触れたことのないような何も知らない人に勉強させる」
ことを前提で考えている

で、>>723 が提示したのは「数列などの順番は関数型の方が教えやすい」というものだ

「何も知らない人に」数列などの順番の入れ替える概念や実際のプログラムを教えるのに、
どちらが教えやすい&理解させやすいんだろうねという議論

だから、リストを使おうが配列を使おうが他のものを使おうが、
そんなことはどうでもいいし、伸縮とかアクセス時間(効率)とかはもっとどうでもいい

私たちが議論していた論点は、これからプログラムを組んでいく上で頻繁に出くわすであろう
要素の入れ替えという概念と実際のプログラムの、教えやすさと理解しやすさだよ
それが理解できなければ効率もなにもない

745 :デフォルトの名無しさん:2011/06/26(日) 11:57:55.72
Haskell は低水準部分を無視してアルゴリズムに没頭できるって言うけどさ、
x := f(x) みたいな簡単なイデオムすらを頭をひねりまくってHaskellに適応させることをアルゴリズムに没頭すると言ってるのなら、
根本的に何か違うと思う

ハードウェアという困難を無視してアルゴリズムに特化してるのではなく、
ハードウェアという困難を無視できる替わりに(アルゴリズムそのものとは別の)新しいHaskellという困難に特化しているんだと思う

そのHaskellという困難はハードウェアという困難よりも学習は困難だと思う

746 :デフォルトの名無しさん:2011/06/26(日) 12:01:01.59
つーか、Haskellには代入がないから、入れ替えなんてできない

747 :デフォルトの名無しさん:2011/06/26(日) 12:06:42.88
>>745
そりゃお前が x に f(x) の値を「代入する」という意味や操作を
C言語などの手続き型言語でどうやるか既に理解しているからだろ

お前はきっと手続き型をかなり身につけていて、
その経験を元に関数型を見ているから学習は困難だろうと感じるんだよ

全く何もプログラムについて知らない奴に教えるんだから、
そもそも「代入」という概念を教えず代わりに「等値」という概念を教えることで
Haskell プログラムを理解させるのはそれほど難しくないと思うぞ
それほど難しくないと思うぞ

748 :デフォルトの名無しさん:2011/06/26(日) 12:07:53.23
>>747
ごめん、2度言ってしまった

749 :デフォルトの名無しさん:2011/06/26(日) 12:34:56.18
>>747
関数型と手続き型は別の概念じゃないでしょう…
代入は関数型の中心的概念で、むしろ、代入しかないのが関数型

Haskellには「再」代入がないだけ

750 :デフォルトの名無しさん:2011/06/26(日) 12:41:45.22
>>749
申し訳ない

>>745
> x := f(x) みたいな簡単なイデオムすら

と言うのが、いわゆる再代入の意味で言っていると完全に思い込んでました
今後は微妙な意味の言葉には気をつけて発言します

751 :デフォルトの名無しさん:2011/06/26(日) 12:46:25.12
>>749 むしろ代入って言葉は再代入前提で使うことがおおくないか?
中心的概念っていうなら「束縛」のほうだろう

>>750
俺もその「イデオム」は再代入前提の例だと思うんだが

752 :デフォルトの名無しさん:2011/06/26(日) 12:50:12.22
再代入は難しい概念じゃなくて、数値計算アルゴリズムや「計算」で勝手に出てくる概念
再代入の避け方を教える方が難しい

753 :デフォルトの名無しさん:2011/06/26(日) 13:48:05.22
こういうレベル高い議論しているとこ無知を晒すんだが、
STモナド(STRef型)って概念として再代入に含まれるんだろうか。

754 :デフォルトの名無しさん:2011/06/26(日) 13:57:15.62
うん

755 :デフォルトの名無しさん:2011/06/26(日) 14:28:09.26
>>734
まあ、ぶっちゃけhaskellでもCでも、リストと配列両方使えるけど、初心者はその言語で基本的なデータ構造使うので、初心者でなければ配列とリストで適した方を使えば良い

ただ、初心者が扱うならせいぜい5個とか10個程度の要素数だろうから、その並べ替え程度なら、要素に名前付けて、入れ替えるだけって言うのも出来る
(>>729の3つ組の例)

あと、初心者はよく
a=a+1
ってどう言う事?とか聞いて来る
代入、(数学ではなく、言語の)変数の概念を理解する必要がある


756 :デフォルトの名無しさん:2011/06/26(日) 14:28:13.39
手続き型支持
1.情報量多い
2.関数型は初心者にとって行間が多い
メモ帳の使い方ぐらいのレベルから解説してる本やサイトなんてないじゃん

757 :デフォルトの名無しさん:2011/06/26(日) 14:35:59.73
そういうことはこれからだな。儲けの種が転がってるともいえる。

758 :デフォルトの名無しさん:2011/06/26(日) 14:37:19.98
>>756
独学なら、情報量の多い手続き型だな
でも、情報量が同じor指導者が居るなら関数型だと思う



759 :デフォルトの名無しさん:2011/06/26(日) 14:40:31.47
そもそも関数型の反対って手続き型なの?
Pascalから入ったから、C言語をはじめて見たとき、これ関数型じゃん、と思ったが

760 :デフォルトの名無しさん:2011/06/26(日) 14:47:30.32
反対とかじゃなくて並列。論理型とか
pascalはローカル関数が使えるんだからCより関数型に近いと思うけど

761 :デフォルトの名無しさん:2011/06/26(日) 14:52:16.65
プロシージャが「関数」だったら関数型、とかいう変な誤解だろ

762 :デフォルトの名無しさん:2011/06/26(日) 14:53:36.10
>>759
関数の意味がまるっきり違う
関数型では、ある意味変数や演算子も関数
(と言うか、逆だな。関数の方が変数と考える)

763 :デフォルトの名無しさん:2011/06/26(日) 15:02:23.16
happyってどうなの?

764 :デフォルトの名無しさん:2011/06/26(日) 15:06:28.23
C言語は関数を変数に代入してるけど
コールバックとか

ポインタ参照とかは定数も関数も変数自身もまるで区別してないし

765 :デフォルトの名無しさん:2011/06/26(日) 15:17:51.69
関数へのポインタであって関数ではない

766 :デフォルトの名無しさん:2011/06/26(日) 15:35:39.60
>>764
それは関数型と言うより、コンピュータの本質かと
データと命令区別してないのはコンピュータの性質

関数ポインタまで使えれば、それに迫れるべ

チューリング等価なのだから、本質的には同じなのは当然

表面的にはどっちよりか?と言う話でしか無いよ
んで、関数型言語と言われる言語と同じ事が簡単に出来るのか?
map関数はCじゃどう作る?


767 :デフォルトの名無しさん:2011/06/26(日) 15:58:15.68
>>758
絵に描いた餅だなあ。

768 :デフォルトの名無しさん:2011/06/26(日) 16:03:22.86
Cでmapを書くのは簡単だよ
高階関数自体は書けるけど、レキシカルスコープの局所関数が書けない

769 :デフォルトの名無しさん:2011/06/26(日) 16:21:41.82
A
B⊆A
C⊆A
B∧C = 0

なんてどんどん登録していけば集合の分割をしてくれるライブラリありませんか?

770 :デフォルトの名無しさん:2011/06/26(日) 16:25:47.22
>>768
純粋な興味でC de map関数は見てみたい
良かったら書いて見てくれへんか


771 :デフォルトの名無しさん:2011/06/26(日) 18:30:43.74
今のコンピュータがレジスタへの代入やメモリの書きかえで動いてる事を考えると、
直感的にコンピュータの動作と一致してるのは手続型だろう。



772 :デフォルトの名無しさん:2011/06/26(日) 18:56:21.48
逆に抽象度が高い方が理解しやすい人間も世の中には少なからずいるから一概には言えん

773 :デフォルトの名無しさん:2011/06/26(日) 19:10:53.14
「計算」か「計算機」のどちらを理解しようとしているかによる。

774 :デフォルトの名無しさん:2011/06/26(日) 19:15:08.77
ここまで無知さらした議論もある意味清々しい

775 :デフォルトの名無しさん:2011/06/26(日) 19:22:37.62
こういうこと言うやつが知恵を感じさせる発言をした試しがない

776 :デフォルトの名無しさん:2011/06/26(日) 19:23:43.58
関数型プロセッサ創れよ

777 :デフォルトの名無しさん:2011/06/26(日) 20:16:57.97
プロセッサというのはプロセスをする装置
プロセスすなわち操作

それは手続き型特有の概念であって、関数型に操作というもは無い
よって、そもそも関数型プロセッサという言葉が矛盾をはらんでいる

778 :デフォルトの名無しさん:2011/06/26(日) 20:19:48.13
>>776
作っても、lispプロセッサーみたく消滅するから無意味

それよりCのmap関数はまだですかね。。。
簡単だと言うので、見られると思ってたんですが


779 :デフォルトの名無しさん:2011/06/26(日) 20:29:14.20
実用性皆無

780 :デフォルトの名無しさん:2011/06/26(日) 20:33:36.14
>>779
何に対してのレスなの?


781 :デフォルトの名無しさん:2011/06/26(日) 20:43:15.06
>>778
void map(const int *input, int *output, int size, int (*f)(int))
{
  int i;
  for(i = 0; i < size; i++) output[i] = f(input[i]);
}

782 :デフォルトの名無しさん:2011/06/26(日) 21:00:34.94
C++のstd::transform()のノリか

783 :デフォルトの名無しさん:2011/06/26(日) 21:07:04.01
>>781
ありがとう

Cを見たとき関数型言語だと思ったって人の話とは全然違う印象だし、簡単と言っても、初心者にはとても簡単には真似出来なさそうだけど。。。

個人的に、ポインタは入門書にも必ず出てくるけど、初心者向けの概念か疑問なんだよね
特に関数ポインタは入門書に載ってない事多いし

そういう意味で(実用性はともかく)、学習用には関数型言語は向いてると思うんだが。。。



784 :デフォルトの名無しさん:2011/06/26(日) 21:09:17.52
C改良の関数型言語が欲しい
ゲームや組み込みでヒットすると思う

785 :デフォルトの名無しさん:2011/06/26(日) 21:11:34.55
あのね。

関数ポインタと、関数という値(たとえば Integer -> Integer という型の値)があることとは、
意味が全然違うから。

786 :デフォルトの名無しさん:2011/06/26(日) 21:15:12.51
お前が違うと思ってるだけ。
必要な機能は自分で書くのがC言語。

787 :デフォルトの名無しさん:2011/06/26(日) 21:18:21.91
言われてみれば、手続き型にカリー化が無いのは意外と痛いかも


788 :デフォルトの名無しさん:2011/06/26(日) 21:23:16.93
え?

789 :デフォルトの名無しさん:2011/06/26(日) 21:24:14.27
>>786
それは関数型言語も同じ
最小限の知識でかなりの関数を自作出来る
(ポインタとか覚えなくても、結構高度な事が出来る)

学習用として、個人的にこの点を評価してる


790 :デフォルトの名無しさん:2011/06/26(日) 21:26:26.66
>>789
同じか同じじゃないかは判断基準による。
Cはノイマン型コンピュータの抽象化言語だから存在意義がある。
この視点は一定以上の需要がある。
学習用という視点なら一考の余地はある。

791 :デフォルトの名無しさん:2011/06/26(日) 21:35:25.51
>>790
そうなんだけど、最初に得る知識量と作れる関数のバランスは、Cだけじゃなく、rubyやpythonよりも良いと思ってる

総合的には手続き型の方が簡単に出来る事多いけど、初心者の知識で出来る事が少な過ぎると感じてる



792 :デフォルトの名無しさん:2011/06/26(日) 21:37:03.90
初心者に関数型とかメリットないだろ。
ブラウザ+Javascriptくらいが妥当。

793 :デフォルトの名無しさん:2011/06/26(日) 21:41:31.61
>>785 qsort「どう違うんだ?」

794 :デフォルトの名無しさん:2011/06/26(日) 21:52:22.35
>>792
初心者にこそメリットある
特に最近の手続き型言語は暗記もののイメージが強い
(Cはそうでも無いけど、今度はコンピュータの知識が必要になる)

関数型言語は、最小限の知識で自作出来るのが、初心者の力の底上げになる


795 :デフォルトの名無しさん:2011/06/26(日) 21:55:30.93
ttp://shyouhei.tumblr.com/post/5545216280/c
ttp://shyouhei.tumblr.com/post/5603961294/c

宗教論争はこのくらいでやめて、粛々とHaskellの話をしましょうよ

796 :デフォルトの名無しさん:2011/06/26(日) 21:55:39.26
haskellの処理系を自作とか流石に無いわ
未踏でも応募するつもりか

797 :デフォルトの名無しさん:2011/06/26(日) 22:00:00.89
>>794
ねーよ

798 :デフォルトの名無しさん:2011/06/26(日) 22:55:52.12
Prologから見たら、Haskellは手続き型言語そのものだと思うが

799 :デフォルトの名無しさん:2011/06/26(日) 23:02:33.28
>>797
いや、文法覚えるのは暗記だから、それ程重要じゃ無い
プログラミングのコツみたいなのを覚える方が重要

それに関数型言語は向いてると思うんだよ


800 :デフォルトの名無しさん:2011/06/26(日) 23:19:30.38
お前らがHaskellで実用ソフトバンバン世に出さないから嘗められるんだろが

801 :デフォルトの名無しさん:2011/06/26(日) 23:26:32.18
実用ソフトを生産してるプログラミング言語No1はアセンブラ
No2はC言語
物凄く大きく差を開いてNo3にJava
CやJavaですらコードを見るとソースの中にアセンブラが埋め込んである体たらく


802 :デフォルトの名無しさん:2011/06/26(日) 23:33:45.71
>>801
Cってマシンに依存しないアセンブラで
インラインアセンブラの部分は
Cが生成できないニーモニックを書くところじゃん


803 :デフォルトの名無しさん:2011/06/26(日) 23:34:41.22
手続き型,関数型∈S, S上の二項関係R
文系,理系∈T,T上の二項関係R'
代数{S,R}から代数{T,R'}へのhomomorphismまたはそのinverseについて

804 :デフォルトの名無しさん:2011/06/26(日) 23:41:50.54
>>802
それだけじゃなくて、レガシーソフト(アセンブラ)との互換性のためにアセンブラを埋め込む
他にも、コンパイラが効率のよいコードを生成できないときにもアセンブラを埋め込む
実用ソフトの世界では、まだ40年前のコードが現役で動いてる

そのうち誰もメンテナンスできなくなって社会インフラが止まる
社会のことを考えたら、Haskellなんかやらせずに、アセンブラプログラマを量産しなくちゃいけないのに…

805 :デフォルトの名無しさん:2011/06/26(日) 23:52:10.32
そういうのは延命する度に後々面倒になるから早めに火吹いてリプレースする機会ないと

806 :デフォルトの名無しさん:2011/06/26(日) 23:55:43.95
40年前っていうとCは存在しないな

807 :デフォルトの名無しさん:2011/06/27(月) 00:15:37.62
>>798
Haskell の何を見て Haskell が「手続き型」だと言っているのだ?

そもそも、>>798 の言う「手続き」とは何だ?

808 :デフォルトの名無しさん:2011/06/27(月) 00:21:54.53
そういや、なにげなく「関数型」というが、定義ははっきりしてないね。

809 :デフォルトの名無しさん:2011/06/27(月) 00:23:23.70
何を持って関数型というのか。
現実的には狂信者の比率で判定する。

810 :デフォルトの名無しさん:2011/06/27(月) 00:28:03.16
>>808
個人的には、右辺と左辺がほとんどの場合等価になる様に設計された言語。と定義してる
(ので、脳内では等価型言語と読み替えようか迷ってる)


811 :デフォルトの名無しさん:2011/06/27(月) 00:33:50.56
いわゆる論理型言語みたいなものか

812 :デフォルトの名無しさん:2011/06/27(月) 00:53:10.60
>>811
違うだろ


813 :デフォルトの名無しさん:2011/06/27(月) 00:55:04.82
論理型言語の = は右辺と左辺が完全に等価。

814 :デフォルトの名無しさん:2011/06/27(月) 00:56:57.01
>>813
そもそも、論理型言語で=をほとんど見ない件


815 :デフォルトの名無しさん:2011/06/27(月) 01:07:43.78
論理型言語は関数の引数と値が同身分
X=f(Y)
と宣言すると、XからYを生成できるし、YからもXを生成する
(Prologだと XとYのペアが出力になる)


816 :デフォルトの名無しさん:2011/06/27(月) 01:17:59.84
>>807
手続き=入力(引数)から出力までの一方向の処理手順

y = x + 1
のとき、Haskell は xに1を加えてyに代入するという「手続き」を表現する
(ちなみに、y == x + 1 のときは y と x+1 が等しければ True を出力せよという「手続き」を表現している)

Y :- X + 1
prologでは、yがx+1と等しいという「関係」を表現する
関係なので方向はない
プログラマは関係だけを表現して、YやXを出力する手続きは処理系の仕事でプログラマは単純には関与できない


817 :デフォルトの名無しさん:2011/06/27(月) 01:34:15.90
>>816
pascal勉強した事無いの?
手続きは、必ずしも値を返す必要無いんだよ?
(Cでいう返り値がvoidの関数)


818 :デフォルトの名無しさん:2011/06/27(月) 02:06:28.81
簡約

819 :デフォルトの名無しさん:2011/06/27(月) 02:08:30.38
でも実際はcut使いまくりで無理やり関与するのが極普通のprologプログラマ

820 :デフォルトの名無しさん:2011/06/27(月) 02:09:32.36
>>817
値を返す必要はないけど、出力はある
チューリングマシーンでいうところの終了状態判定出力
PrologにもPaskalの手続きにも出力はある


821 :デフォルトの名無しさん:2011/06/27(月) 02:14:42.28
簡約を手続きと表現するなら出力というのはあれだ、簡約の停止が相当するんじゃないか
となると停止しない式というのもあるから出力が無い式というのも当然あるな
でもそれはvoidとはちと違う(始対象と型付ラムダ計算の簡約系における圏みたいなの使って無理やり対応させることはできるけど)

822 :デフォルトの名無しさん:2011/06/27(月) 02:19:38.37
手続き型 ⇔ 宣言型
関数型 ⇔ 実引数なしの関数は1階未満の関数のみ代入対象になってる型

関数型の対立概念は手続き型ではない


823 :デフォルトの名無しさん:2011/06/27(月) 02:59:03.96
>>806
鉄道会社で生きてるプログラムのワニ脳みたいな部分はほとんどがアセンブラ言語
当時の天才連中が高級言語を使わずにニーモニック表だけでバカデカいシステムをバグなく組み立てちゃった
高級言語で組み直す気すら起きないほど品質が良かったためそのまま生存競争に勝ってきた
2000年問題のときに外科手術が必要になって切り開いたけど、そのときはアセンブリ職人がいたからなんとかなった
今はそのアセンブリ職人も退職した
もう怖くて誰も手を出せない

自分でプログラムの才能があると思う人はHaskell捨ててアセンブラやりましょう


824 :デフォルトの名無しさん:2011/06/27(月) 03:22:05.50
楽しみ捨てて苦行やりましょう、といわれても

825 :デフォルトの名無しさん:2011/06/27(月) 05:10:16.12
>>823
禿げる

禿げないようにする為高級言語が生まれたのだ

826 :デフォルトの名無しさん:2011/06/27(月) 09:06:34.47
宣言型←→命令型だろ

827 :デフォルトの名無しさん:2011/06/27(月) 09:10:27.12
>>823
小学生の時にハンドアセンブルしてZ80のプログラム書いてた。

828 :デフォルトの名無しさん:2011/06/27(月) 11:59:07.04
Z80とかPICみたいな玩具触ったぐらいでは手も足も出ないのがレガシーシステム

829 :デフォルトの名無しさん:2011/06/27(月) 12:55:26.00
>>816
なるほど、面白いな、そういう考え方もあるのか

俺は違って、プログラマに手続きの手順(プロセス)が見えていなければ
手続き型とは言わないと思う
逆に言えば、計算の手順を記述するのが手続き型だと思う

だから、y = x + 1 のようなプリミティブな式では、
たとえそれが C 言語で書かれていようと、「それだけ」では手続き型とは判断できん
もう少し大きなプログラムでなければ分からない

Haskell の本質はプログラムは計算の手順を記述(指示)するものだとは言えない
手順は処理系が生むものだからだ

C 言語は明らかに計算の手順を記述するため、迷わず手続き型と言える
(式を順に評価し、その式が評価された時の環境の状態を記述しているとも言える)

ただ、言語によって区分は曖昧なところも幾分あるから、最近は
プログラムの意味を表示的意味論で表すのが自然と感じるのが関数型で、
操作的意味論で表のが自然と感じるのが手続き型ではないかと考えている

ちなみに、Haskellで y=x+1 と記述した場合、これは同値を表す
同じスコープでyと書かれているところをx+1と書き換えても、
x+1と書かれているところをyと書き換えても、
また同じスコープのどこで定義しても、意味は同じだ

830 :デフォルトの名無しさん:2011/06/27(月) 13:04:19.12
>>828
俺が学生の時、所属大学の物理学科が使ってるある古い装置のプログラムを
アセンブラで組んだ事があったな。
お前詳しいだろ、ちょっとこい、と言われて助手の給料で働かされた。

831 :デフォルトの名無しさん:2011/06/27(月) 13:47:42.14
骨董品がそんな簡単なものばかりなら
>>823みたいな状況にはならない
大学で使われてるのは比較的簡素なものだろう

832 :デフォルトの名無しさん:2011/06/27(月) 14:19:36.52
>>831
おい、俺をバカにすんのか?
スーパーハカーだぞ

833 :デフォルトの名無しさん:2011/06/27(月) 14:33:11.23
なんだ自慢したいだけか
つまらない

834 :デフォルトの名無しさん:2011/06/27(月) 14:42:13.26
物理で使う装置って言ってもピンきりだからな。
加速器とかのプログラムは難しそう。よくわかんない。

835 :デフォルトの名無しさん:2011/06/27(月) 17:20:59.18
手続き型は手順を書くのが主で
関数という概念はあるが、その関数も多くの場合は手順として書かれる

関数型は「式」を書くのが主で、関数は「式」として書かれ
より純粋なものになると、手続きすら式となる

てな感じだと思う

>>819
無理矢理っつーか、処理系が作り出すフローを
流れを変えて制御してやるのがPrologのプログラミングだろ

836 :デフォルトの名無しさん:2011/06/27(月) 20:32:37.50
関数型プログラミングの大元はたしか関数定義の集まりがプログラムになる
ようなもののことを指していて、別に言語がどうこうとかあんまり関係なかったはず。
アセンブラやFortranに比べた場合、FPやLispは関数だらけだったから、
これは関数型プログラミングだ、というのは、意味があったんだろうけど今はあんまり関係ないだろ。
さらに言えば、副作用がどうこうとか完璧後付けだし、関数定義でプログラムが構成されていれば
関数型言語でいいんじゃね。

837 :デフォルトの名無しさん:2011/06/27(月) 20:52:00.87
完全に120%本末転倒。

関数定義の集まりがプログラムになる、なんてのが、90年頃から広まった
C言語は関数型言語とかいう意味不明なデマから逆に推測された変な定義だから。

値を取って値を返す、数学的な「関数」(すなわち副作用がない)だけで
プログラムを作ろう、というのが、FPとかが提唱したことで、そちらこそが
本家本元の「関数型」。で、歴史的に見るとLispがそういうのの初めだったと。

838 :デフォルトの名無しさん:2011/06/27(月) 20:56:05.74
ん?ラムダ計算がベース理論になってるのが関数型言語じゃないの?

839 :デフォルトの名無しさん:2011/06/27(月) 21:15:58.61
いや、年代的にも間違いなく90年代以前からだ。
FPはプログラム代数というのを理論として持っているけど、λ計算とは違う。
Lispもλ計算を実現するために設計されたみたいな話が蔓延しているけど、
それもたしか後付けだったはず。

840 :デフォルトの名無しさん:2011/06/27(月) 21:28:13.72
Lispがラムダ計算を起源としていないというのは、これの4pの最初にある。
http://repository.readscheme.org/ftp/papers/ai-lab-pubs/AIM-453.pdf

841 :デフォルトの名無しさん:2011/06/27(月) 21:42:21.38
関数型かどうかというのは言語の性質ではなくて
プログラミングのスタイルじゃないか、という気が最近はしている。

MLやLISPを使っていると特に。

842 :デフォルトの名無しさん:2011/06/27(月) 21:49:07.12
MLは意図的に手続き型ないし命令型のような要素を含んでる。
Lispは最初から関数型じゃないスタイルも持ってる。

843 :デフォルトの名無しさん:2011/06/27(月) 21:57:50.80
別に可読性を保ちつつ動けば何でもいいだろ。

844 :デフォルトの名無しさん:2011/06/27(月) 22:00:01.00
C++で関数型

845 :デフォルトの名無しさん:2011/06/27(月) 22:01:52.07
コンビネータが出てくると関数型って感じする

つBoost.Spirit

846 :デフォルトの名無しさん:2011/06/27(月) 22:01:56.66
>>838
C言語もラムダ計算で表現できる
シャバにあるC言語のプログラムを数学的にきちんとした仕様で表現しようとする研究でラムダ計算が大活躍してた

847 :デフォルトの名無しさん:2011/06/27(月) 22:41:54.74
個人的には、関数が第1級オブジェクトであると同時に、その場で(コードのある地点で)関数を定義できるものを
広い意味で関数型言語とみなしている。Cは別の場所で関数定義しなきゃいけないから関数型じゃない。
C++のラムダは変態だけど関数型とみなしてる。

あとはコーディングスタイルが、どれだけその場関数定義を多用するかで関数型の度合いを見ている。
だからCLよりもSchemeの方が関数型だと感じる。

848 :デフォルトの名無しさん:2011/06/27(月) 23:16:04.83
>>829
Prologを作った人(Kowalski)が言うには

アルゴリズム = 論理 + 制御

アルゴリズムを書くと言うことは制御(手順や手続き)を書くことになるそうだ
つまり論理型から見ると関数型はより手続きということらしい
現実のPrologは関数型よりよっぽど手続き的だけどな

849 :デフォルトの名無しさん:2011/06/28(火) 00:02:53.24
個人的には紙と鉛筆で実行させて(簡約して)結果を得られるのが関数型言語

異論は認める


850 :デフォルトの名無しさん:2011/06/28(火) 04:13:21.81
どうでもいい定義ばっかだな

851 :デフォルトの名無しさん:2011/06/28(火) 05:25:26.85
haddockってソースに#includeがあるだけで止まるの?

その行で: lexical error at character 'i'

でストップするんだけど

852 :デフォルトの名無しさん:2011/06/28(火) 18:19:53.57
私がチラ裏を2chに書く理由:
ブログだと継続的に高品質な文章を書かないとほとんど見てもらえないから。
2chなら気が向いた時だけ書きこめば多くの人に見てもらえるから。

853 :デフォルトの名無しさん:2011/06/28(火) 18:30:09.61
おれはブログに載せる前のアイディアの推敲かな

854 :デフォルトの名無しさん:2011/06/28(火) 21:31:39.93
ブログとかキモ

855 :uy ◆KOAgYBL/Xg :2011/06/29(水) 12:43:27.29
ブログとかきも 同意
見て貰う為とか、どこのすいーつ(笑)だよ

技術日誌とか、自分にとって一番見やすすく記憶しやすいようにメモしていきゃいいんだよ
ノートを教師に見せる為にかいてるような、そういうタイプだと中級者より上には絶対いけやしない

856 :デフォルトの名無しさん:2011/06/29(水) 12:45:26.02
Haskell なら中級者までいければ十分だよな

857 :デフォルトの名無しさん:2011/06/29(水) 13:11:40.11
>>855
違うね。

ブログで重要なのは:

1.売名
2.自分の思想を普及させてしまえば自分が第一人者になれる→儲かる
3.アフィリ
4.仲間を見つけるため

858 :デフォルトの名無しさん:2011/06/29(水) 14:17:24.78
winhugsはファイルをドラッグアンドドロップして関数ロードできるから便利に使ってたんだけど
テキストファイルに書いた関数もロードできたのでびっくりした。

拡張子変えなくていいので楽。

859 :デフォルトの名無しさん:2011/06/29(水) 20:51:37.65
関数をとってその関数を別の文脈で使用する関数に変換することを
その文脈に持ち上げるといいますが

定数をとって別の文脈で使用する関数に変換することもそういいますか?

Real World Haskell 231P constPのことです

860 :デフォルトの名無しさん:2011/06/30(木) 10:46:14.46
>>859
そういっても何も差し支えないと思うんだけど。 定数ってのは引数なしで値を返す関数のことなんだし。

861 :デフォルトの名無しさん:2011/06/30(木) 14:22:45.04
>>860
どの引数を受け取っても同じ値を返す関数が定数(0階関数)

862 :860:2011/06/30(木) 20:18:21.69
>>861
なのかー。素で勘違いしてた。

863 :デフォルトの名無しさん:2011/06/30(木) 20:36:08.74
こんな素敵な404ページみたの初めて
https://github.com/LearnBoost/Socket.IO-node/issues/279

864 :デフォルトの名無しさん:2011/06/30(木) 21:48:37.23
>>861
定数に引数が渡せません><

Prelude> 1 2

<interactive>:1:1:
No instance for (Num (a0 -> t0))
arising from the literal `1'
Possible fix: add an instance decla
In the expression: 1
In the expression: 1 2
In an equation for `it': it = 1 2

865 :デフォルトの名無しさん:2011/06/30(木) 21:57:31.02
861ではないが0階関数(ていうか0項演算っていわない?)って書いてるじゃん。
>>864は1項演算扱いしている。

866 :デフォルトの名無しさん:2011/06/30(木) 21:58:57.26
>>865
どの引数を受け取っても同じ値を返す関数が定数(0階関数)

867 :デフォルトの名無しさん:2011/06/30(木) 22:00:58.25
> どの引数を受け取っても同じ値を返す関数

こうですか

\x -> 1

868 :デフォルトの名無しさん:2011/06/30(木) 22:02:56.00
>>860 の意味での定数は計算機科学の話でよく出てくる

関数の引数の数を項数(アリティ)と言い、項数0の関数を定数とする、
というような感じで

>>861 の意味での定数は、俺はプログラミングの文脈では聞いたことないな
たしかに f x y = 3 は定数として働くよなという気はするが・・・

これはどういう文脈での定義なの?
数学とか?

869 :デフォルトの名無しさん:2011/06/30(木) 22:32:29.07
「どの引数をとっても同じ値を返すのが定数」という解釈は数学(微分)で出てくる
f(x)の微分をf'(x)と書く
f が多項式のとき、f''''''''(x)のように「''''」をくっつけていくと、これはいつか定数になる
f''''''''(x)はxに何を入れても同じ値を返す関数であり、同時に定数

「○階関数」という呼び名は論理学で出てくる
2階関数 f(f(x), y)
1階関数 f(x, y)
0階関数 c






870 :デフォルトの名無しさん:2011/06/30(木) 22:38:56.73
0階はすべて個物対象で、集合(関数)はないだろ。

871 :デフォルトの名無しさん:2011/06/30(木) 23:03:40.49
結局のところ >>869 の説明が、
>>859 の質問を受けた >>860 の返答とどう繋がるのか分からん

この場合は >>860 の認識で間違ってないんじゃないの?

872 :デフォルトの名無しさん:2011/06/30(木) 23:14:03.36
定数 ⊂ 関数

873 :デフォルトの名無しさん:2011/06/30(木) 23:26:22.57
説明がないと、何を意図しているのか誰にもわからないよ。
質問にも答えていないし。

874 :デフォルトの名無しさん:2011/06/30(木) 23:47:20.61
>>871
引数なしだが定数ではない関数がある(例 乱数関数、メモリ関数、main)
引数がある関数なのに定数である関数がある(例 f x = 0、メモリ関数、=、main)

875 :デフォルトの名無しさん:2011/07/01(金) 00:50:37.68
正直、HaskellはPrologと同じ運命をたどると思う


876 :デフォルトの名無しさん:2011/07/01(金) 07:51:45.73
>>874
>>861 の定義も文脈によっては存在するとしてだ
引数無しの関数を定数と定義するのも文脈によってはあることは知ってるよな
つまり、どちらも正しくて文脈によって変わる

>>859 の質問と >>860 の返答で使われている「定数」という言葉は
どちら文脈で解釈するのがより適切なんだ?
俺は計算機科学の文脈で普通に使われる定義で考えるべきだと思うが

ちなみに、Control.Applicative.pure 関数は a -> f a という型で
"Lift a value." という説明があるから、このような場合も
持ち上げと言って差し支えない


877 :デフォルトの名無しさん:2011/07/01(金) 09:06:27.80
Haskellの知識なしにモナディウスのコードを眺めてたのですが
IORef,keyboardMouseCallback,addTimerCallbackなどみてると
手続き型と変わらないように見えました。
みなさんはどのあたりにHaskellで書くメリットを感じているのでしょうか。

878 :デフォルトの名無しさん:2011/07/01(金) 09:46:52.65
>>877
俺は型にうるさいところと代数データ型

879 :デフォルトの名無しさん:2011/07/01(金) 09:55:51.41
>>877
グラフィックとかGUIが絡むと手続き臭が漂って臭くなるのは
仕方がないことかも。ホント臭いよな。

880 :デフォルトの名無しさん:2011/07/01(金) 12:47:36.83
>>877
その辺り FRP を使うとコードがスッキリする(可能性が高い)

もう少し言うと、かなりの量の臭い部分をライブラリ内に閉じ込められる
自分でライブラリを作るのなら、臭い部分を綺麗に分けられるとも言える
(その可能性が高い)

今ちょうどテトリスの製作を目指して FRP ライブラリを作っているところ
そのうち公開する

881 :デフォルトの名無しさん:2011/07/01(金) 13:03:53.60
Monadius.hsあたりが本気でヤバイ
もうVBで作ったゲームみたいなコードになってる
この辺はexistential typeとか使えば普通のOOPL程度にはすっきりしそう
あとは直で埋め込んであるデータを(de)?serializeを用いたDIっぽいやり方でコードの外に追い出してやるとか?

882 :デフォルトの名無しさん:2011/07/01(金) 15:04:25.06
また口だけ大王ばっかに

883 :デフォルトの名無しさん:2011/07/01(金) 15:13:30.88
FRPライブラリってもう一杯出てるやん
reactive, yampa, elerea, grapefruit, banana, buster...


884 :デフォルトの名無しさん:2011/07/01(金) 15:20:19.78
じゃあおいちゃんはbanana一本もらおうかな

885 :デフォルトの名無しさん:2011/07/01(金) 21:09:53.53
>>883
自分で作るのが面白いんだよ

Conal さんも自分 FRP を作ってみようよって言ってる
http://stackoverflow.com/questions/1028250/what-is-functional-reactive-programming


886 :デフォルトの名無しさん:2011/07/02(土) 01:53:49.24
FRPってよく分からないんですが、
C言語でやるとしたら、変数のアドレスを代入することで実現するモノなんでしょうか?


887 :デフォルトの名無しさん:2011/07/02(土) 04:14:57.30
>>886
入力側に変数しか定義できなくて良いなら変数ポインタで実現できますが、
式を定義できるようにするには式へのポインタの代わりになる物が必要です。
C言語にはオブジェクトもクロージャもないので関数ポインタが定番でしょう。

888 :デフォルトの名無しさん:2011/07/02(土) 16:10:38.52
>>886
FRP はファンクショナルなリアクティブ プログラミングだ

C言語でやるならファンクショナルである必要はないし、
無理にファンクショナルにすると返って変なことになる
普通にリアクティブなシステムをプログラムすればいい

で、リアクティブなシステムというのは、
外部の入力や変化(マウスボタンとか、メニューの選択とか、別の計算結果とか)
に反応して結果を返すというシステムだ
意味論は書籍「コンピュータ サイエンス入門 論理とプログラム意味論」が詳しい

たとえば、Windows の GUI がリアクティブなシステムの代表例だ
それを実現するために Windows では外部の入力や変化を
メッセージという形でブロードキャストする
それをウィンドウプロシージャで受け取るというのが、
リアクティブなシステムをプログラムするひとつの例だよ
C言語で実現させる具体例は >>887 が一例挙げている

そんなリアクティブなシステムを
関数型らしく宣言的にプログラムする仕組みが FRP だ

889 :デフォルトの名無しさん:2011/07/02(土) 16:23:59.08
しかし論文書いて終わりのライブラリばっかりw

890 :デフォルトの名無しさん:2011/07/02(土) 16:24:35.26
面白いとは思うけど実用的じゃない

891 :デフォルトの名無しさん:2011/07/02(土) 16:30:23.15
>>890
その FRP を使って何か具体的なものを作ったという話が、
残念ながらサンプル以外になかなか見ないからな

だからテトリスを作ろうと思う

892 :デフォルトの名無しさん:2011/07/02(土) 16:32:21.02
テトリス作れば実用的なの?

893 :デフォルトの名無しさん:2011/07/02(土) 16:37:17.13
今ならFRPで簡単なRTS作るだけでも学士論文ぐらいにはなりそうだなw

894 :デフォルトの名無しさん:2011/07/02(土) 16:48:07.54
>>892
FRPを使ってゲームとしてちゃんと遊べるテトリスを完成さることができれば
そのFRPライブラリは実用に一歩近づくと俺は思ってる

なんでテトリスかというと、ゲームシーンの遷移や、ロジック、
グラフィック処理などゲームに必要な基礎要素がコンパクトにまとまってて、
FRP の恩恵がどれくらいのものか検証しやすいから

それでいて、古典ゲームなのに今プレイしても楽しいし

895 :デフォルトの名無しさん:2011/07/02(土) 17:00:05.78
ニューラルネットみたいに、数字が伝搬してるヤツに向いてるってこと?

896 :デフォルトの名無しさん:2011/07/02(土) 17:00:18.44
ゲームって結局、
「状態機械に、入力デバイスをリアルタイムで反映させた差分式で更新して
 外部デバイスに出力する、を繰り返す。」というモデルだと思うんだけど
これを関数型にできる、もしくはしてメリットがあるものなのかな。

897 :デフォルトの名無しさん:2011/07/02(土) 17:16:33.77
>>896
「関数型にできる事」にメリットがあるかは作って検証してみないことには分からんな
まぁ今のところ俺の予想だと、んなの C# で作った方が楽に決まってる
つまり関数型にできる事にたいしてメリットは無いと思う

俺は単純に Haskell で今までよりもゲームが作りやすくなるって事に、
むちゃくちゃ大きなメリットがあると思う
(実際に作りやすくなったかも検証次第だが、作りやすくなると信じて取り組んでる)

たとえミニゲームでも思ってたよりサクサク作れたら
Haskell って楽しいなって思ってくれる人がきっと増える

898 :デフォルトの名無しさん:2011/07/02(土) 17:18:25.03
おれはゲームが作りやすくなるには否定的な感触だけど
ぜひ結果が出せたら教えてくれ。

899 :デフォルトの名無しさん:2011/07/02(土) 17:24:05.05
ぜひ結果が出たら論文を書いてくれ!

900 :デフォルトの名無しさん:2011/07/02(土) 17:42:19.09
>>899
嫌だよ

論文なんてひとつも書いたことないから、
書き方勉強するだけで余計に時間取られる
ただでさえ仕事で疲れるのに

ホームページ作って、夏休みの自由研究の感じでアップする
という公開方法なら気楽でいい(夏中に終わるわけ無いが)

ただ、そんなことは皮算用なんで、今はとにかく研究・実験に集中する

901 :デフォルトの名無しさん:2011/07/02(土) 18:01:17.35
>>894
今ならテトリスより倉庫番とかQIXの方が有り難がられる

902 :デフォルトの名無しさん:2011/07/02(土) 18:10:01.81
ん?QIXて流行ってんの?
倉庫番はイベントドリブンでもかけるからちょっと意味合い違っちゃう。

903 :デフォルトの名無しさん:2011/07/02(土) 18:14:21.75
いやテトリスが食傷だっただけだけど

ソースコードがここの書き込み1回で済ませられる程コンパクトな
ジャバスクリプト版も出回ってるくらいだし

ファッションセンス

904 :デフォルトの名無しさん:2011/07/02(土) 18:47:11.75
自由研究という文字列だけを見て
小学生が夏休みの自由研究でHaskellを使ったFRPでゲームみたいに空目し
凄い小学生もいるもんだと勝手に感動してしまった

905 :デフォルトの名無しさん:2011/07/02(土) 19:40:20.34
>>901
いいじゃん、俺はテトリスが好きなんだよ

クイックスなんて地味だし、動いてる敵のAIがめんどい
領地計算が何となく見難しそうだし

倉庫番の解説なんかとっくの昔にセガの人に先越されてて、今さら感ありあり
キャラ一人だけでリアルタイム性も無いし、動いてる間はキー入力受け付けないから、
Behavior の有難味がいまひとつだし

906 :デフォルトの名無しさん:2011/07/02(土) 19:48:32.43
そうか。お前が言うならそうなのだろう

907 :デフォルトの名無しさん:2011/07/02(土) 22:29:02.66
ブロック崩しとかはもうあるから(ex. elerea-examples)テトリスあたりが適当なんだろうな
シューティングまでいくと流石に飛躍しすぎて挫折しそうだし

908 :デフォルトの名無しさん:2011/07/03(日) 03:53:18.93
Haskellってクロージャかけるの?

909 :デフォルトの名無しさん:2011/07/03(日) 04:59:49.72
Prelude> let kurouja = "kurouja"
Prelude> kurouja
"kurouja"
Prelude>

910 :デフォルトの名無しさん:2011/07/03(日) 11:06:31.56
>>908
むしろクロージャは関数型言語が元祖だが。。。
クロージャは高階関数という名前でクロージャと意識しなくても簡単には使える


911 :デフォルトの名無しさん:2011/07/03(日) 11:19:53.80
多分そういう意味ではないと思う

912 :デフォルトの名無しさん:2011/07/03(日) 11:23:22.04
「状態を閉じ込めたもの」を書けるか、ということなら、
型に制限がある、という答えになるのかなぁ

913 :デフォルトの名無しさん:2011/07/03(日) 11:50:17.40
なんか集合論で使われる関係とか位相でいう閉じているとか開いてる
っていう概念を使って閉方っていうのを定義するというのを聞いた事がある
関数型言語で使われるクローじゃもそれ由来なのかな?
ちなみにポイントフリーのポイントってのは位相由来というのも話だけは聞いたことあるけどどういうもんかはよくわからん
位相は挫折したからな

914 :デフォルトの名無しさん:2011/07/03(日) 12:16:18.54
集合・位相・距離

915 :デフォルトの名無しさん:2011/07/03(日) 12:21:36.14
プログラミング言語で言うクロージャは、動的スコープに対して、静的スコープによって
名前の参照が関数を定義するスコープに閉じてる、ということ。

数学とはあまり関係ない。

916 :デフォルトの名無しさん:2011/07/03(日) 12:27:53.74
わかりにくい。ローカル環境をもつ関数オブジェクトでいいだろ。

917 :デフォルトの名無しさん:2011/07/03(日) 12:36:59.74
なんだよローカル環境ってw
自分定義の用語使って分かり易い説明ですか?www

918 :デフォルトの名無しさん:2011/07/03(日) 12:47:36.08
任意の開集合の逆像が常に開集合だと連続だよね(キリッ

919 :デフォルトの名無しさん:2011/07/03(日) 13:05:39.58
>>917
悪いが、言わんとしていることは >>916 の方が分かりやすかった

920 :デフォルトの名無しさん:2011/07/03(日) 13:24:55.55
Prelude> let x = 10; foo y = x + y
Prelude> foo 10
20
Prelude>


921 :デフォルトの名無しさん:2011/07/03(日) 13:33:11.20
ubuntu> cat a.hs
foo x =
let y = 10
in (\z -> x + y + z)

ubuntu> ghci a.hs
GHCi, version 7.0.4: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Loading package ffi-1.0 ... linking ... done.
[1 of 1] Compiling Main ( a.hs, interpreted )
Ok, modules loaded: Main.
*Main> (foo 20) 30
60
*Main>
これで回答になっとるやろ。でfuncitonal2ch@twitterってなして
lisp系を無視してる?呆れる

922 :デフォルトの名無しさん:2011/07/03(日) 14:11:48.07
変数束縛だったらこっちのほうが良かったか。
Prelude> let a = (+ 3)
Prelude> a 4
7
Prelude> (+3) 4
7
Prelude>

923 :デフォルトの名無しさん:2011/07/03(日) 20:20:29.25
>>917
大域環境ではない局所的な環境のことだよ。Lispだと関数定義の中だけで
既に定義されている変数の上書きできるだろ、その変数の情報を収めている
環境のことだよ。

なんでも過去のLispは環境の実装がいまみたいにきっちりしてなかったみたいで、
関数呼び出しをする場所によって、自由変数の指す値が変わってしまったそうだ。
そんな摩訶不思議なことを避けるために、関数定義の中で閉じた変数束縛の手法
のことをクロージャーと呼ぶようになったらしい。
http://www.amazon.co.jp/dp/400007685X

924 :デフォルトの名無しさん:2011/07/03(日) 21:10:19.97
数学セミナー7月号から、圏論の歩き方って連載が開始されてる
初回の記事は対談形式で、圏とは何ぞや?なぜ圏なのか?(なぜ圏を使うのか?)とかが、書いてた

少しは圏について得るものがあるかちょっと楽しみ


925 :デフォルトの名無しさん:2011/07/03(日) 21:54:38.15
プログラミングに関係するとしたら自然性と普遍性だろうけれど、
どのようにプログラミングに適用すれば良いのか?という実践的ノウハウが
みあたらないし、仮にそれがあったとしても、高い導入コストに見合う
リターンがあるのか不明。
多分直接的になにか役に立つという方向はあんまり期待できないと思う。

そういう系じゃなくて、なんでそんなわけわからないものに関心が向いてしまうのか
とか、琴線に触れてくるものは一体なんなのか?という原因を見付け出したほうが
一般的に使える結果が得られると思う。圏論の言葉を使う必然性も全くないし。
そもそも、全くよくわからないし利害性もないのに関心が向くなんてどう考えてもおかしいだろ。

926 :デフォルトの名無しさん:2011/07/03(日) 21:55:54.30
数学セミナーとか購読してるような奴らが
Haskellの当たり前なユーザなのか

こりゃ他言語と毛色が違うな

927 :デフォルトの名無しさん:2011/07/03(日) 22:12:08.12
>>925
今回の記事によると「(思ったよりも)ローコスト、(経験的に)ハイリターン」だそうな

連載の記事を書く人は、それぞれの分野で道具として圏論を使ってる人がリレーしながら書く予定だとかで、今回の記事(対談)でも、「唯一の正しい抽象化のレベル」とは限らないと書いてる

記事から感じるのは現実問題として、コスパが良かったから選んでるって言う印象


928 :デフォルトの名無しさん:2011/07/03(日) 23:40:59.88
圏論勉強会とか参加してる連中がこの言語ユーザーの主流派だしなぁ。

929 :デフォルトの名無しさん:2011/07/04(月) 00:11:53.44
いやHaskell勉強会に100人も集まるのは、そういう人のほうが少ないだろ

930 :デフォルトの名無しさん:2011/07/04(月) 00:33:43.03
RubyのRedmineに対抗してHedline開発してよ

931 :デフォルトの名無しさん:2011/07/04(月) 07:17:37.72
Redmineが既にあるのにHedlineを開発する動機が無い

932 :デフォルトの名無しさん:2011/07/04(月) 21:46:24.36
>>927
評価者が全員数学系なので、数学系の中ではコスパがいいという話ではあるけど、
そこから一般論としてコスパがいいという結論は導けない。

実現可能で有効性も十分立証できる論拠を持ってこないことには、
圏論をやらなくてはならない理由にはならない。

933 :デフォルトの名無しさん:2011/07/04(月) 22:26:49.54
>>932
俺が思うに >>327 は一般論として言っているつもりは無いと思う。
「数学系の中では充分に使いものになる」ってのならそれはそれでひとつの知見として有用じゃないかな。

だいたい Haskell は抽象化のために圏論の概念を使ってるんだろ。
だったらその概念を (程度はともかくとして) 理解する必要があるのはあたりまえじゃね?
Java を使うのにオブジェクト指向を理解する必要があるのと同じ。


934 :デフォルトの名無しさん:2011/07/05(火) 03:21:50.97
計算機科学は数学系。
まぁ、現在の計算機科学者自体が学問的に見た場合、数学の出来ない落ち零れなので
数学を否定したがる人がたくさんいるのは、分からないでもない。
そういえば、言語制作者で自分は数学が苦手という恥ずかしいことを言ってる人がいたっけ。

935 :デフォルトの名無しさん:2011/07/05(火) 03:48:33.09
実績もなく数学もダメってんじゃどうしようもないが
もしそれで実績があるなら大したものだ……
数学系がなんとかかんとかよりも、よっぽど有能だろう

936 :デフォルトの名無しさん:2011/07/05(火) 04:07:41.62
有能なのは分かるが、実績があるからと言ってその言語が整合的とは限らない。
というか、ほとんどの言語制作者は整合性を無視しているか、整合性について分かってない。


937 :デフォルトの名無しさん:2011/07/05(火) 04:17:39.29
ここんとこ抽象論が続いてるな
具体的なコード提示してうだうだ議論してる所を眺めたい

938 :デフォルトの名無しさん:2011/07/05(火) 04:19:00.22
言語の整合性なんて気にするユーザーはごく僅かってことですね


939 :デフォルトの名無しさん:2011/07/05(火) 04:39:15.50
重要ではないか、もしくは極端な話、
不整合があるぐらいのほうが実用上良い可能性がある
そもそも整合性というのがよく分からないんだが、どうやって評価するんだ?

940 :デフォルトの名無しさん:2011/07/05(火) 04:42:56.81
Haskellやってなお実用的という奴は下に見てる

941 :デフォルトの名無しさん:2011/07/05(火) 07:08:01.98
不整合があるってことは、副作用があるというのと同義じゃ?
実用って言葉を使いたがる人ってようけいるけど、
実用的って言葉ほどマジックワードはないよね。haskellくらいなら
ひと通りのものは揃ってるくらいだし。

942 :デフォルトの名無しさん:2011/07/05(火) 07:20:27.26
>>941
> haskellくらいならひと通りのものは揃ってるくらいだし。

ひと通りのものは揃ってるのに、それを利用して
「**を作りました」といってアップする人がほとんどいない
つまり、実用性を外部に身を以て示す人がいない

何故だろ

943 :デフォルトの名無しさん:2011/07/05(火) 08:21:47.46
啓蒙活動が足りない

944 :デフォルトの名無しさん:2011/07/05(火) 08:26:30.76
>>942
いない? 調べもせずにいけしゃあしゃあといいよる

945 :デフォルトの名無しさん:2011/07/05(火) 08:43:00.05
少なくともこのスレにはいないし
xmonad、モナディウス、Houseとか正直トイレベルの域出ないでしょ。

946 :デフォルトの名無しさん:2011/07/05(火) 08:43:58.68
最大の啓蒙活動は実用的なプログラムがオープンソースでたくさん出ることなんだけどな。

947 :デフォルトの名無しさん:2011/07/05(火) 09:10:48.23
>>945
トイレレベルかと思ったらおもちゃかww

948 :デフォルトの名無しさん:2011/07/05(火) 09:11:30.58
マイクロソフトのエヴァンジェリストを雇う

949 :デフォルトの名無しさん:2011/07/05(火) 09:14:02.06
ないないない、と言い続ける奴って、
たいてい何があってもそういい続けるビーコンだよな、大抵。

950 :デフォルトの名無しさん:2011/07/05(火) 09:15:44.02
実際ないじゃん。

951 :デフォルトの名無しさん:2011/07/05(火) 10:07:30.80
ベンチャーキャピタルでHaskellを使ってる所が幾つかある、っていうのは聞いたことがあるけど。
Jane StreetはHaskellの従兄弟のOCaml使ってるし、意外な所で使われてるかもよ。

まあ、オープンソースで広く使われてる、っていうと確かにあまり聞かないけど。
Darcsくらい? いつもはLisp方面にいるんだけど、Common Lispのプロジェクトとかで、
Darcs使ってる所とかが何故か多い。

952 :デフォルトの名無しさん:2011/07/05(火) 10:55:56.57
とりあえず数当てゲームでいいから誰か書いてよ

953 :デフォルトの名無しさん:2011/07/05(火) 11:29:32.27
トイレレベルというがそれを言えるのはトイレレベル以上のソフトウエア
を組めるものの特権だよ。そうじゃなければただのバカとしか言いようがない。
そもそも実用といってる人間にとって実用とは何か?
もう一歩掘り進んだ意味を答えたほうがいいよ。

954 :デフォルトの名無しさん:2011/07/05(火) 11:35:51.86
なんだよトイレレベルって
突っ込み待ちか?

955 :デフォルトの名無しさん:2011/07/05(火) 11:50:24.59
>>953
ああ?TOTOとINAXディスってるのか?
俺シャワートイレ板の有名コテだからあまり舐めたこと言わないほうがいいよ

956 :デフォルトの名無しさん:2011/07/05(火) 12:25:14.14
>>955
意味不明なんですが。もしなめたことと捉えていて、そのまま、こんご
も舐められたとしたら、あなたはシャワートイレ板でHaskellスレで
舐められたと暴れまくるんですか?トイレ通な人がなん人もこちらに
来るように仕向けて成功するんでしょうか?なにをもってトイレのコ
テハンだということを権威付けしているのかよくわかりません。そろ
そろスレとは無関係なので、これ以上はコメントを差し控えますが。

957 :デフォルトの名無しさん:2011/07/05(火) 12:41:57.67
>>944
調べ方が悪かったのかもしれない
実用性を外部に身を以て示す人を挙げて頂けないか

> 「**を作りました」といってアップする人がほとんどいない

こちらの「ほとんどいない」の方は同意して頂けた認識してよろしいか?

958 :デフォルトの名無しさん:2011/07/05(火) 12:49:50.31
作ろうと思えば作れるんだから今ならそういうの作って名をあげるチャンスと肯定的に捉えよう

959 :デフォルトの名無しさん:2011/07/05(火) 16:07:13.55
こういうんじゃ駄目なん? 個人じゃないし、インハウスツールだから、全然広めてないけど。

ttp://d.hatena.ne.jp/camlspotter/20080912/1221193444
ttp://d.hatena.ne.jp/camlspotter/20100330/1269927047
ttp://d.hatena.ne.jp/camlspotter/20101212/1292165692
ttp://cufp.org/jobs/language/31

最初のはリーマン・ショックとドンピシャだから、多分リーマン・ブラザーズのこと。

960 :デフォルトの名無しさん:2011/07/05(火) 18:01:12.30
>>959
そりゃ聞くまでもなくダメだろ
「実用性を外部に身を以て示す人」なんだから

961 :デフォルトの名無しさん:2011/07/05(火) 18:31:05.42
文章を読まない、論理的に思考できない。そんな人に何をどう説明しろと?

962 :デフォルトの名無しさん:2011/07/05(火) 18:58:36.81
Haskellを使って個々で色々活動してる人は俺も何人か知ってる
たぶん、俺が知らないところでもっと多くの人たちが活動してるんだろ

でも彼らは「**を作りました」って実用性をアピールしたりはしない
しないというのは言い過ぎかも知れんが、そう感じる
個々で、あるいは小グループで黙々と活動してる感じだ

まぁ、実は窓の杜のアプリの多くがHaskell製だったりするかもしれんが

963 :デフォルトの名無しさん:2011/07/05(火) 19:41:12.91
話が微妙にずれてる気がするな。>>942は実用性の無さを仄めかしてるのかと思ったけど、
単に目立つエヴァンジェリストの不在を指摘したいの? それなら知らないし、いないと思う。
LLとは出自が違うんだし、毛色も違う言語だし、現れにくいんじゃないかな。

それに、Paul Grahamみたいなの、実際いたら鬱陶しいよ? 無駄に叩かれるし。
Larry WallとかGuido van Rossumみたいな感じならまだ救いがあるけど。

964 :デフォルトの名無しさん:2011/07/05(火) 20:18:50.28
ラムちゃんTシャツが?

965 :デフォルトの名無しさん:2011/07/05(火) 20:54:00.49
>>933
前段についてはそのとおりだ。だけど、言葉が足りていないので、
>>927はHaskellをやる人すべてが圏論を知らないといけないという意味に取れる。

後段についても一理あるものの、別に実際プログラミングするにあたって、
”いちいち厳密で整合性をもたせた数学的な〜”というようなお題目がつきそうな
ものを土台としてプログラムする、なんてストレス溜まって普通に無理だろ。

なんか圏論わかってます系な人に、『こんなプログラムするなんてこいつは
全然圏論わかってない!』とか暗に馬鹿にされるんだろうな〜とか思いながら
プログラムをしたいというなら別だけど。

適当に圏論は箔付けの為だと割りきってひな壇にいてもらうことにして、プログラミング
としては、圏論は尊重はするポーズはするものの完全無視の独立した技法を開発したほうが
絶対良いと思うんだ。

966 :デフォルトの名無しさん:2011/07/05(火) 20:58:11.35
>>963
べつに目立つエヴァンジェリストのレベルまでいかなくていいよ
「こんなん作ったけどどうよ」 って言って「完成させたアプリ」をアップする
こんな程度でいいんだよ
そういうのがちょこちょこっと出てくると、
あぁHaskellって「使えるね」と感じる人が増えてくると思うんだ

でも現実は・・・ そんな人見ないよね

Haskell人口って決して少なくないと思うんだが
なんでだろ? 何が原因なんだろ? という話

>>941 はひと通りのものは揃ってると言うが、もしかしたら何かが足りないとか?

967 :933:2011/07/05(火) 21:30:55.37
>>965
いやあ、 Java とかだってデザインパターンわかってます系な人に
『こんなプログラムするなんてこいつは全然デザインパターンをわかってない!』
とか暗に馬鹿にされるんだろうな〜とか思いながらプログラムしたりするよ。

つっても、そのわかってます系の人のわかってるレベルっていうのは
実際には理論を全部網羅してるレベルじゃないだろ。
Haskell 使いは全ての人が圏論を知ってないといけないだろうと思うけど、その程度に知っていれば充分。
私が「程度はともかく」と但書を付けたのはそういうこと。

968 :デフォルトの名無しさん:2011/07/05(火) 22:19:47.62
別に知らなくてもいいよ。<圏論
使ってるうちに興味が沸いて深く理解したければどうぞってやつだ。
プログラミング言語に限らないけど
何かと最初から敷居を上げたがる傾向にあるよね。これはあなただけの
問題ではないから皮肉ってるわけではないよ。
はっきり言ってモナドも理解しなくてもこの時にこう使うということ
だけ知っておくだけでとりあえずは作れるよ。だが、そのことは無視して
最初から、敷居を上げたがるから難解に見えるというのはある。
丁度、ポインタを知らなくても動くプログラムはCでも作れるというのと
同じだし、デザパタも同じだよね。オブジェクト指向は知ってると
スパゲティ製造言語から逃れられるんだろうか?

969 :デフォルトの名無しさん:2011/07/05(火) 22:26:53.36
そ〜いえば、planet haskellで良くジャーマンメタルの人みたいな人の
記事が上がってるね。ぱっと見てヘヴィメタっぽいおっさんと思ってしまった。

970 :デフォルトの名無しさん:2011/07/05(火) 22:38:52.77
圏論圏論という人は、どこまで理解してるのだろう。
マクレーンくらいは読んでるのか。


971 :デフォルトの名無しさん:2011/07/06(水) 01:25:49.27
>>970
> 圏論圏論という人は、どこまで理解してるのだろう。
> マクレーンくらいは読んでるのか。

あれを読んで理解できれば数学の院生で通用するよ
さらに使いこなせれば数学者の卵ぐらいにはなれる

972 :デフォルトの名無しさん:2011/07/06(水) 05:49:09.56
>>966
ttps://github.com/search?type=Repositories&language=Haskell&q=language%3AHaskell&repo=&langOverride=&x=0&y=0&start_value=1

4,000件以上もあれば、言語人口と比較して十分過ぎると思うけど、足りんの?
TwitterやBittorrentのクライアントとか、アプリケーションサーバとかいっぱいあるよ。
むしろ、自分が普段使ってる言語の少なさに泣けた。Haskell侮れんな。

973 :デフォルトの名無しさん:2011/07/06(水) 07:30:17.38
>>972
数は申し分ないけど、なんかな、なんか違うんだよなぁ

でも、こんなん作ったけどどうよって言って
完成させたアプリをアップする人を見ないというのは、
俺の完全な間違いだと分かった
すまなかった

でもなぁ、日本人がアプリって聞いて想像(期待)するものとは何か違う気がする
アプリの定義なんて無いから、これらもHaskellのアプリだよと言われれば、
そうだよねとしか言えんけど・・・

974 :デフォルトの名無しさん:2011/07/06(水) 07:39:37.22
良くも悪くもこれから、って感じじゃないかなー。
>>958が言うように、今ならキラーアプリ作って名を上げるチャンスということでひとつ。

975 :デフォルトの名無しさん:2011/07/06(水) 08:40:34.50
数学とズブズブの関係を築くことがトレンドなのか?

976 :デフォルトの名無しさん:2011/07/06(水) 08:56:41.73
数学の気分を味わうだけの言語です

977 :デフォルトの名無しさん:2011/07/06(水) 18:31:53.47
むしろ数学の式は全部Haskellで書いて欲しい
中学ぐらいまでの数学記号は流石に分かるが
高校以降のはさっぱり覚えられなかったぜ
上下左右真ん中のどれがどの引数だったか未だに迷う

978 :デフォルトの名無しさん:2011/07/06(水) 20:09:13.35
そんなんでよく卒業できたな

979 :デフォルトの名無しさん:2011/07/06(水) 20:15:50.02
f(x)で高校数学からドロップアウトした漏れがきました
どうやら当時は関数って考え方がまったく理解できなかったらしい

980 :デフォルトの名無しさん:2011/07/06(水) 22:08:47.16
軽い知的障害なんじゃないの

981 :デフォルトの名無しさん:2011/07/06(水) 22:40:32.53
授業中に教師に教えてもらおうと思うと少しも理解できなかったな
ってか、教科書は予習・復習で理解してしまうものだろ

982 :デフォルトの名無しさん:2011/07/06(水) 22:44:49.65
すまん予習復習とか宿題以外にしたことがなかった。愚かだった

>>980
いやほらプログラミングならわかりやすい名前のついた関数をまずやって
それから無名関数とか抽象度の高い概念に移るでしょ?
ところが数学はいきなりf(x)だから当時の漏れは困っちゃったという話

983 :デフォルトの名無しさん:2011/07/06(水) 23:04:05.12
>>978
高卒なんで、そんなもんです

984 :デフォルトの名無しさん:2011/07/06(水) 23:09:02.99
煽りにマジレス

985 :デフォルトの名無しさん:2011/07/06(水) 23:11:09.83
>>982
f(x)の次にg(x)が出てきたろ。
普通の脳ミソがあれば悪くてもその辺で理解できる。

986 :デフォルトの名無しさん:2011/07/06(水) 23:14:43.78
>>983
言葉が足りなかった

高卒をよく卒業できたなと言ったつもりだった

987 :デフォルトの名無しさん:2011/07/06(水) 23:15:15.16
>>986
高卒をよく

高校をよく

988 :デフォルトの名無しさん:2011/07/07(木) 00:03:38.67
>>983
自分も高卒だが、そこまで理解出来ないなんて事は無かったぞ


989 :デフォルトの名無しさん:2011/07/07(木) 00:08:08.34
>>988
そうか…まあ、数1数Aだけやってそれ以上は授業あんまりなかったからな

990 :デフォルトの名無しさん:2011/07/07(木) 00:27:56.60
割合の計算でどっちを分母にするの分からない人なら大学にたくさんいたが


991 :デフォルトの名無しさん:2011/07/07(木) 00:31:42.75
>>989
。。。。という事は、自分と同じく工業高校卒か
頭良いやつと悪い奴の差が激しいからな。。。


992 :デフォルトの名無しさん:2011/07/07(木) 00:43:00.57
コンプ持ちが使う言語

993 :デフォルトの名無しさん:2011/07/07(木) 00:49:49.46
Haskellスレなのに。
数VCくらいは当然じゃないの、関連は強くないけどこれくらい教養じゃないの

994 :デフォルトの名無しさん:2011/07/07(木) 00:50:21.69
どちらにしてもコンプ持ちが使う言語

995 :デフォルトの名無しさん:2011/07/07(木) 01:03:01.90
>>993
普通高校だと、そう
工業高校はAとTに特化してる


996 :デフォルトの名無しさん:2011/07/07(木) 02:28:46.32
高校数学というと、未だにこの記法が好きになれない

(g o f)(x) = g(f(x))

関数の流れと文字の流れが逆転していて、かなり分かりづらかった記憶がある
大学以降だと、f: x → y みたいな記法が導入されて
こっちは自然に読めたんだが

997 :デフォルトの名無しさん:2011/07/07(木) 06:58:36.81
>>991
むしろ高卒っつーたら普通工業とか商業とかで普通高校ではないだろ大概
ちなみに商業もAと1特化で2とBは触りしかやらない

>>993
Haskellのお陰で興味を持てたのよ、高校以降の数学に

998 :デフォルトの名無しさん:2011/07/07(木) 07:23:11.93
そこでf;;gという記法ですよ
圏論関係の文献でたまーに結構使われてる

999 :デフォルトの名無しさん:2011/07/07(木) 08:05:47.92
>>996
その書き方は高校数学とは関係ない。
むしろ代数学的な書き方。

1000 :デフォルトの名無しさん:2011/07/07(木) 08:35:43.25
1000だとHaskell で作られたOSが世界を旋回する。

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

263 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)