関数型プログラミング言語Haskell Part14
1 :
デフォルトの名無しさん :
2011/03/06(日) 13:32:08.91
おぉ、大事なものを忘れてた、ありがと ところで Hoogle と Hayoo って機能的には同等? 俺は Hoogle の方が発音しやすいから、ずっとこっちを使ってるが というか、人に勧めるのに「ひゃゆぅ〜」って言うの恥ずかしい
Hayooは初めて知りますた Hoogle:公式、最新データ Hayoo:Holumbusプロジェクトの一部で、検索結果に使用例も出る みたいな感じ? 使ってる人いれば適当にフォローお願いします
では諸君、議論をレジュームしたまえ
なんかもう、どーでもよくなってきた
あ、じゃあ 最近気になったので聞いてみる Haskellって人工知能との相性はどうなんだろ
そういうのは言語に依らないと思うのだが
>>10 論文を書きやすいという意味で、Haskellと人工知能の相性はすこぶる良い
>>11 C言語でAIとかの本も出てたし、本質的にはそうなんだろうけど、人工知能と言えばPrologってイメージが有るじゃ無いですか
>>12-13 ありがとです
何か、詰碁を解くのに向いてるとか聞いたんで、ひょっとして?と思ったんですよね
数値計算のプログラムを作るのが難しいプログラミング言語は、AIに向いているといっておけば間違いない
解候補の集合の生成と探索の制御が楽なのでAIに向いていると言えなくもない ぶっちゃけ可変配列の書式が楽な言語は全部AIに向いている
sampou.orgにあるContinuationモナドのcallCC関数の定義 callCC f = Cont $ \k -> runCont (f (\a -> Cont $ \_ -> k a)) k これの最後のkって必ず評価されないと思うんだけど合ってるのかな
そのkってモナドに入ってくる前のcontinuationでしょ? じゃ最初に評価されるんでないの?
ごめん、評価の問題じゃないね runCont (f (\a -> Cont $ \_ -> k a))に適用する方のkはCont $ \_ -> k aで捨てられてるから、 それならundefinedに置き換えても問題なく動くんじゃないの、と
あ、callCC $ \exit -> ...でexit呼ばれなかった時の為か
Haskell Platform がリリースされたと思ったら大地が揺れたでござる
停電でインストール出来ない・・・
>>26 -fglasgow-extsを拒否するようになって、大地の神さまが激怒されただよ
諸君、祈祷したまえ
31 :
479 :2011/03/13(日) 13:55:50.34
>>26 ,29,30
思わず震災さえもネタにしてしまうのは、
普段から抽象的な思考に努めているHaskeller特有の発想なのだろうか?
それとも自分達は一般人には手の届かない特別なプログラミングをしているという、
潜在的な選民意識の現れなのだろうか?
関西大震災発生直後の現地取材で
「まるで温泉街のようだ」とコメントした某TBSの故アナウンサを憶い出す。
関西大震災で知人が被災した経験のある自分には、
そんなHaskellerの感性が理解できない、理解したくない。
つまらないネタとそれに噛みつく奴は 全部同一人物だと思っている
そういうことにだけは熱心な人たちねw
不謹慎=俺が哀しんでるんだからおまえも哀しめ、空気読め
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
数学的なやつじゃなくてモナドがどのようにコンピューター科学にどう応用されているかみたいな 詳しい本おしえてください。
モナドをコンピュータ科学に利用しているというより、 命令文の実行順を基礎数学だけを用いて表現したモデルがモナド 命令文の順序付き重複集合をモナドで表現したことで、新たに何かが生まれたという話は聞かない ただ、モナドで表現できたことで論文を大量生産できた
Moggi91の例では集合の圏を使って例外付き計算、副作用を持つ計算を抽象化してるな で、そこにモナドがあってその性質はうんたらかんたらとかそういう内容 モナドを使えば典型的な計算を綺麗に構成できるって事はまぁそれなりに嬉しい事なんじゃないのかな
モナード
>>39 アーカイブがダウソロードできないのだが(藁
オンラインで見れるからいいじゃないか
>>42 nobsun になんとかして、って伝えたら直ると思う
自分でputCharとかのような出力関数を定義するのってどうするんだ? よそのGUIライブラリのDLLをHaskellで使いたいんだけど、IOが遅延されてこまってる。 createWindowみたいなIO()の関数があっても、 これを出力と認識してないみたいで最後まで実行されないんだ。
遅延させるってのは勘違いで、問題は別にあるんじゃね? HaskellはIO動作を勝手に遅延したりしないよ
あ、そのとおりだった。 IO(a->b)の(a->b)の副作用のある関数が返ってきてて、その関数を実行してないのが問題だったっぽい。 thx
>>48 > IO(a->b)の(a->b)の副作用のある関数が返ってきてて
それなら、IO (a -> IO b) であるべきなんじゃ…
>>49 ぬぬ、たしかにそうかも。
というかVisualC++で作ったDLLの引数がある関数を呼んだら
Segmentation fault/access violation in generated code
って怒られた。runghcなら通るのに、コンパイルして実行するときだけ……。
51 :
49 :2011/03/22(火) 05:57:11.86
52 :
デフォルトの名無しさん :2011/03/22(火) 21:49:40.52
わざわざサンクス。 原因はDLLの関数をHaskellで定義するときに、stdcallにしてたのが原因だった。 ccallにしないと駄目なのね。基準がわからんぜ。 とりあえずDirectXの関数をDLLにエクスポートしてライフゲーム実装するところまではできたから、 あとは何とかなりそう。 猛者たちのスレを汚してすまんね。
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 に直接メールするのが正しいですか?バグ登録をする専用のページなどがありますか?
東京のハスケラーは水道水飲んでる?
飲んでるけど評価遅延させてるから大丈夫
評価しなければ一生大丈夫ってことだな
東京だが、普段から浄水器で浄化した水飲んでるから問題なし。 だいたい基準値の3倍程度の放射能なら一生飲み続けても高々0.07%ガン発生率がアップするだけだし、 浄水器使ってればさらに下がるでしょ。 気にしてる奴の方がストレスが原因で禿げるか死ぬかするw
>>56 数年後、忘れた頃にインフルエンザとかで病院行って尿検査したら、
溜まった分が一気に評価されるぞ
>>58 浄水器に放射性物質が溜まったら楽しそうね。
0.07%って宝くじで1億円あたる確率より高いよね
>>63 人間死ぬまでに50%の確率で発がんするんだってさ。
50.07%に発がん率がアップしたとして気にするの?
65 :
デフォルトの名無しさん :2011/03/24(木) 17:05:48.54
50%ってwwww 1人の母集合を対象に癌になるかならないかというのは確率じゃねーよwww
1人でしょうか。 いいえ、複数です。 だろ
浄水器に溜まるならOK。浄水器を抱いて寝るやつはいないんだから。
>>68 ろ過システムは、溜ったヤツがたまにポロって取れて流れてくるから
Haskellの話をしなさい
>>70 遅延評価は、溜ったヤツがたまにポロって取れて流れてくるから
硫黄で腐食した藻などが混入する場合が有りますが副作用はありませんので どうかご安心ください
こんな Haskell 本あったら読みたい こんな Haskell 関係の記事があったら読みたい ってのは何かある? 俺は Arrow を実際のアプリ製作でどう使うのかとか、 あのライブラリではこういう目的でこう使ってる、 みたい解説がある本が読みたい
>>74 はじめは反時計回りにみえた。
たぶん、時計回りに見えるのが正しいだろうから(理由は省略)、オレの能力には小さな問題があるんだろう。
俺は時計回りにしか見えない、ヤバい
まあ地震関連のデマよりは害が少ないかな
反時計回りに見えるようになった
はじめは時計回りにしか見えなかった。 これで、反時計回りに見えるって、どんな理屈なんだろうと、 画像の差を意識してたら、乳首に気がついて、 乳首が見えるってことは、ブラしてないんだろ? なんで、揺れないんだ?って不思議に思いながら乳首を見つめていたら、 今度は、反時計回りにしか見えなくなっちゃった。
これいつのネタだよ
haskellでこういう動画作れないですか
作れる
>>74 時計回り・反時計回りどっちもできるようになった!
時計周りにしか見えん…
QuasiQuotesを使って新しい文法を導入したい。 Haskellのリテラルとか式とかdoの中の文とかは既存の文法を基本的に使って、そこに少しだけ新しい文法を入れたい。 そのためには、基本的な構文要素の出来合いのパーサーがあって、それをパーサーコンビネータで組み合わせて使用できればうれしい。 で、探してみると、haskell-src-extsライブラリというのはあったけど、繰り返しとか、選言とかのコンビネータはないよね。 どうすればいい? haskell-src-extsの上にどうにかしてコンビネータを自分で実装する? あるいは、基本的なリテラルとかの構文要素もParsecとかでパーサーを作ったほうが早い? それとも、haskell-src-exts + Parsec みたいなテクニックが存在する?
諸君、議論したまえ
gaeでhaskell使えた
89 :
デフォルトの名無しさん :2011/04/05(火) 16:57:08.58
GUIライブラリは何が良さそうですかね?
>>89 Windowsで動けば良いなら、面倒くさいけど、Win32APIバインディングを直接たたくのが無難。
LinuxではGTKを以前Cで使い込んだことがあるから、Gtk2Hsを試したことがあるけど、最新版のGHCに対応してない時期があって使わなくなった。
もっとも、その後動きがあって、その状況は改善されている、たぶん。
面倒くさくてもよいならX11バインディングを使う道もある。
(他のUnix系も同様のはず)
クロスプラットフォームなら、WxHaskellが良く使われている印象だけど、オレはなじめなかった。
3DCGをやりたいならGLUTもある。
HaskellのGUIライブラリは基本的に他言語のライブラリのバインディングなので、選択基準としては、他の言語で使うときとほとんど同じになるだろう:
1. どのOSで動かしたいか
2. 何をしたいか。ダイアログが一つ表示できればそれでよいのか。統合開発環境みたいな複雑なGUIアプリケーションを作りたいのか。あるいはゲームか。
3. 使ったことがあるか。資料は豊富か(他言語向けの資料でも良い)。
haskellからWPFを叩きたい!
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
他の依存パッケージは普通にネット越しにインストールすればいい
>>94 乙。こういう問題解決の報告って良いよね。
ghc7でqtHaskellをインストールするとエラーすんのでその解決方法。 ぐぐったら出てきたのだけど、StackOverflowの1件のみだったので日本語で書いておく。 build.plはghc7未対応だから諦めて手作業(Manual Installation参照)。 runhaskell Setup.hs buildするとQtc/Core/Attributes.hsが583行目でエラーするので583行目を下記のように書き換える。 reject' = (Qslot "reject()", \_ -> ())
getDirectoryContentsとか、getArgsとかにunicode混じってると化けてしまうのはどうにか出来ませんか?
98 :
97 :2011/04/10(日) 03:57:40.00
追記:GHC7.0.2 標準入出力の方は問題なく動いています。
大儀であっ
utf8-string System.Environment.UTF8 Codec.Binary.UTF8.String (decodeString)
>>97 OS環境のロケールと、コマンド引数、ファイル名の符号化が一致していないのではなくって?
そういうことをhaskellプログラム側でごちゃごちゃやるより(できないとは言わない)、OSのセットアップとか、作業パスを見直したほうが良いと思う。
>amachang 今粛々と民事刑事の方面で進めています。一応、すべて証拠として保存しなければいけないので、冗談でも今はこのスレに変なこと書き込まないでください。
>2011/01/28
http://hibari.2ch.net/test/read.cgi/prog/1291518728/ >1 :amachang撲滅振興協議会:2010/12/05(日) 12:12:08
> amachangが憎い・・・・amachangが許せない・・・・
> ククク・・・・クククククク・・・・・
> クックックックックックックッ・・・・・
> クー、クー、クー、クー、クー、クー・・・・・
>
> もう許せない。
> もはや沸き上がる滅意を抑えることが出来ない!!!
>>100 Codec.Binary.UTF8.StringのdecodeStringとencodeStringの2つで解決しました。
ありがとうございました。
>>101 恐らく
>>100 を前提に書いて下さったと思うのですが、そこにすら至ってませんでした。
104 :
g :2011/04/11(月) 00:29:18.93
utf8-stringのことは忘れてtextパッケージを使いましょうみたいなのを以前聞いたことがある
106 :
デフォルトの名無しさん :2011/04/12(火) 11:27:42.51
hackageを見ても説明が不十分だったり無かったりで、引数や戻り値、名前が抽象的過ぎて何をする関数なのかが分からなかったりする事が多々ある。 みんなどこ見て各パッケージの使い方覚えてるの?
よくわからないものはソースを見る
hackage に載ってる作者のサイトとか見る ソースも見る それで分からなかったら、基になってる論文などを漁ってみる
109 :
デフォルトの名無しさん :2011/04/12(火) 15:00:24.31
やはりそれしかないのか… 参考になりました。ありがとう。
諸君、議論をレジュームし給え
一々インストールしたパッケージのヘルプ作る為に haddockするの面倒です 屡々エラーでるし 目的のパッケージが多数の他パッケージに依存していた場合なんて 発狂しそうです
cabal\config ファイル内にある "documentation : True" のコメントを外しておけ そうすれば cabal install でドキュメントも自動的にインストールされる (依存パッケージのドキュメントも全て自動でインストールされる) インストール先も config ファイルで設定できる デフォルトでは\doc フォルダ内 index.html や doc-index-*.html ファイルらも自動で融合してくれる
ネット繋がってないので runghc Setup configureからやってるんです キャバルって確か依存グラフ作って必要なのをダウンロードするんですよね 英語ドキュンメントに確かにhaddockを内部呼び出しするっぽい事書いてありましたが いずれにせよキャバルは無理だと思います
それなら、必要な依存パッケージは全て手元にあるんだよな ドキュメントをインストールするのに 依存関係を考慮して順番を気にする必要は無いはずだから、 スクリプトでも書いて自動化させればいいだけだと思うが Haskell で書いたっていいわけだし 何が問題なんだ?
そういえば、cabal の config ファイルには、 ローカルレポジトリのパスを指定できる項目もある 手元の全依存パッケージをそこにぶち込めば、 "cabal install パッケージ名" でドキュメントも含めて全て 全自動でローカルからインストールされるんじゃないか? 俺は興味ないから詳しくは知らんが、調べてみる価値はあるかも
はいやってみます 有り難うございました
ライブラリの使い方が分からないから論文みるて
昔、Data.Bijection の使い方が分からなくて調べていたら There and Back Again: Arrows for Invertible Programming という論文にたどり着いたことはある まぁ、使い方という言うか、どちらかと言えば意味が知りたかったんだが
統計学パッケージはあるけど サンプルからヒストグラムを生成してくれるライブラリは無いようですね
標準ライブラリの Data.Array の accumArray がまさにその機能を持つのだが、 そういうことではない?
久しぶりにハスケルを調べたけど、haskell 2010 って仕様ができたんやね。 もう浦島だな。苦笑 ところで N + K パターン って 再帰とは違うの? 再帰であることの十分条件? それでアマゾンみてるとcraft3eになって10年以上ぶりに改定されるんやね。 なんかなにもかも浦島です。
しかし、N+K パターンほど応用範囲の狭い構文糖衣も無いな
failとn+kは抹殺すべき
単相性制限ちゃんは悪くないよ
>>126 Real World Haskell 第6章10節に、望まれても愛されてもいないので、
Haskell標準の次期改訂からは間違いなく外されるでしょうと言わしめた
単相性制限の有用性について詳しく
>>127 x :: Integer
x = 1
と書くより、
x = 1
と書いたほうが短い。
・・・・・・じつは、haskell report 98を読んだが、よく分からなかった。
なんか、
x = let {a = 1} in (a, a)
y :: (Int, Float)
y = x
みたいなコードがかけるとイヤだ、みたいなことが書いてあった。
それと、exportするときに型が決まっていたほうがうれしいでしょ、みたいなことが書いてあって、そりゃコンパイラの最適化はしやすいだろうと思ったが、よく分からん。
なくしたらdecidableじゃなくなると思うんだけど 最近はそれに代わるより扱いやすい制限があるの?
>>129 型が決定できなくなるってこと?
たしかに、単相性制限がなければ、型が決定できなくなるケースは増えるけど、そういった問題がなくなるわけじゃない。
例えば
f s = show $ read s
みたいなコードは単相性制限があろうとなかろうとエラーになる。
そもそも、型の不一致でエラーがでないようにするためには最も一般的な多相型が推論できればそれでよいのであり、またそのような型を推論してくれほうが便利・
そして、単相性制限があると、かえって最も一般的な多相型を推論することを妨害する。
単相性制限はHaskellで一番荒れる話題
そんな話題で熱く論争できるとは…レベル高っ
xmonadの設定ファイルの読み方を聞こうとしたものの あまりにレベルが違いすぎて何度も書き込みをキャンセルした漏れが 泣きながら通りすぎます。
ここは初心者歓迎だよ。そもそもHaskellスレは一個しかないし
俺は形式意味論研究してる立場だからhaskell使ってくれる奴が増えるのは大歓迎。 俺の考え方を押し付ける相手がいないと困るからな。
Haskellの形式意味論は公式にあったっけ? どうでもいいが、ときどき論文に出てくるサブセットの意味論は 操作意味論 + 表示意味論で、余り純粋ではないね。 男なら表示意味論で非同期例外やI/Oも込みで押し通すべき。
非公式なら少しある 公式にはない ない理由が「言語設計者たちが考えること」って本に書かれてたと思う
Standard ML以下か…
言語設計者たち〜にはできなかった言い訳が書いてあったように覚えてる
形式意味論が完全でない、あるいはドキュメント化されていない理由は、
>>3 にある "A History of Haskell" にも書かれている
3.4 Haskell has no formal semantics
要するに、急を要する仕事ではなかったし、
それでユーザーも実装者も何とかやっていけるだろうし
そもそもユーザーにとっては型チェックが通れば意味論なんてどうでもいいだろ
それに意味論を完全に定義しちゃうと、
新機能を追加したりシェイプアップするのにかなり時間がかかる
いちいち新たに意味論を考えて既存のものとの整合性を考慮しなきゃならないからね
意味論の完全性を過剰に求めるのは、むしろ言語の進化を阻害するんだよ
とのこと
>>139 100% 完全に意味論が定義された Standard ML に比べれば、
意味論の定義の完全性という点では、理論的には全言語が Standard ML 以下だ
HaskellのGCはどれくらい最先端なのですか?
そういやleksahの話題って出ないね
145 :
デフォルトの名無しさん :2011/04/20(水) 19:13:14.58
leksahとmanateeはyi以上にオワコン
yiっていーの?
Vimライクでない開発環境は使う気がしない 矢印キーで移動とかやってられんわ
Emacsだって矢印キー使わずとも移動できるよ まあ例によってctrlだからvi派には合わんだろうが
宗教論争ktkr
自宅のDHCP鯖のログを見ると知らないMACアドレスが30個も接続された形跡がある。
151 :
デフォルトの名無しさん :2011/04/22(金) 19:06:28.68
>>147 Vimのエミュレーションモードあるみたいだよ。
Features:
Emacs, Vim and Cua (subset) emulations provided by default
数値計算やってるんですけど、デカい行列を次々に更新していくんですけど、 そのときに、行列の100万くらいある要素のごく一部だけを更新するんです これってもしかして、行列を更新するたびに、いちいち100万くらいの要素全部をコピーし直さなくちゃいけないんでしょうか?
>>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の「配列 のリスト」にするだけでも相当変わると思うんだけど。
STArrayとかSTUArrayとか使いなされ
>>153 1000×1000の行列で、対角線に沿って要素に非ゼロの数字が入ってて、対角線から離れるとほとんど要素は0
で、ノイズとしてところどころ(1000個くらい)に非ゼロの数値が入ってる
どの要素にノイズが乗るかは、まるで決まっていない
計算するときには、対角線を中心に1000〜5000個の要素だけがコロコロ更新される
ノイズ部分は絶対値が0に近づく方向にだけ更新される
要素が0のところは絶対に更新されない
やっぱり破壊的更新しないとダメですかね…
>>154 よく分かってないんですけど、STArray って、破壊的更新してるんじゃないんですよね?
してるよ Haskellでもmutableな配列はIOに汚染させずに使える STモナドを調べておくれ
>>155 それならリストでもMapでもいけると思う。
だって、リストなりMapに存在しないデータをゼロとみなせば、実際に保持しておく必要のあるデータは千のオーダーなんでしょ。
Data.MapのfindWithDefaultとinsertで楽勝じゃね?
>>158 プログラムを書くときにはどの位置の要素にゼロじゃないデータが入るかわからないけど、上手にできますかね
160 :
デフォルトの名無しさん :2011/04/23(土) 16:18:28.95
>>159 0じゃない要素だけ値と座標を持てばいいんじゃない?
んでmapやhashを使えば要素数が増えても参照時間はそんな伸びないし。
残りは仮想的に扱えばいいように思える。
>>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のデータを削除したほうが良いはず。
ガウスの消去法でさえも、どうやればいいのかちょっと悩んでしまう。 Haskellってコードの作成コストと保守コストは低いかもしれんが、プログラマを養成するコストがとんでもないことにならないか?
エントロピーって言葉を知っているかい? Haskellで得られる生産性の高さはHaskellを学ぶ労力と釣り合わないってことさ
新卒プログラマをデスマーチに投入することで生まれる 希望から絶望への相転移エネルギーを回収することで宇宙のエントロピーは減少するのさ。
何言ってるのかよくわからないからりりかSOSで例えてくれ
死屍累々たる新卒を糧にして命の花は咲くということさ。
おまいら・・・
>>162 この手の問題は、IOモナドやSTモナドで配列の破壊的更新をしてしまうという解は常にあるわけで、「Haskellらしさ」にこだわらなければ他の言語よりむずかしいということはないと思う。
モナドって何さ? というのはたしかに説明するのが難しいけど、そこはまぁ、LISPとかと同じように「変数に値をバインドしている」と考えることにすればいいわけで。
「変数に値をバインド」というのは何さ? 変数って値を入れておく箱じゃないの? といわれたら、これまた面倒だが、そこまでBASIC時代の人は無視しても良いと…
破壊的更新はHaskellらしくないと嫌う風潮があるけど、状態モナドを使ったほうが自然なアルゴリズム、破壊的更新のほうが理解しやすいプログラムというのはありえ、そういうときに破壊的更新を躊躇するのはむしろ良くないことだと思う。
アルゴリズムはその解法を実際に表現し行うシステム
(プログラミング言語や人の思考)あってのものなので
破壊的更新をする手続き的なプログラムの方が表現しやすい、だから、
破壊的更新をするアルゴリズムを採用する
破壊的更新をしない宣言的なプログラムの方が表現しやすい、だから、
破壊的更新をしないアルゴリズムを採用する
というのが本来目指す姿であって、まずはこのように考える
当然その時の自分の能力によっては、そんなに上手く行かないかもしれない
しかし、解きたい問題の本質を考えて数式で表現できれば、
破壊的更新をしないアルゴリズムを見つけやすくなる
この辺りは「Pearls of Functional Algorithm Design」で大いに学べる
もしどうしても破壊的更新をしなければならなくなった場合でも、
Haskell は逐次的にちまちまと更新するのは苦手だが、
一気に更新するのはメモリ効率的にも速度的にも記述的にもそれほど問題ない
それをするためにもできるだけ宣言的なプログラムを目指すのは意味がある
>>152 は何となく初めに破壊的更新をするアルゴリズムを採用し、
それを Haskell でどう表現しようかと、本来とは逆の思考をしているように感じる
例えば手続き型を対象とした数値計算の解説書の方法を Haskell に移植するとか
既に破壊的更新をしないアルゴリズムについて考えた後であれば余計なお世話であった
スピードを考えないなら手続き的な更新による手法の大半は 全体を丸ごと置き換えることだけ考えてれば楽ちんなんだがな
難しいことを考えなくても手続き的アルゴリズムをSTUArrayで素直に実装するだけでいいのに
UArrayすら殆ど知られてないのに、STUArrayが周知されるのはいったい何年後やら…
難しいことを考えずに素直にJavaで実装すればおk
Haskell as a better Java
>170 F#への新参者だが丸ごと書き換えるのはいろいろと楽でいいねぇ。 大方の場合、パフォーマンスでも問題ないし。
> エントロピーって言葉を知っているかい? エントロピーって単語を使ってみたかっただけだよな? 頼むからそうだと言ってくれ
>>176 魔法少女まどか☆マギカって知ってるかい?
最近のアニメって浅い知識で専門用語使いたがるね。正直萎えるわ
そんな事言ったらこの世からSFがすべて無くなるぞw
関数型言語と気軽にいうが、言葉の意味をきちんと説明できる人 が皆無なのと同じことだ
アニメを含む娯楽作品は、作者の思いが込められたりはするが、 それを深読みしたり現実の世界と繋げたりすることは二の次で、 まずは純粋に楽しめよ Haskellも関数型とかモナドとかはとりあえず二の次で、 まずは純粋に楽しめよ
楽しむよりもビジネスにするのが大事だと思うが。
ビジネスとか言ってる奴笑えるw
>>182 それも大いに大事だが、そちらはお前ががんばってくれ
おれは純粋に楽しむ
>>178 本格SFでさえ専門家から見ればプププなんじゃないの?
食らえ!アローモナド!
くくく……単相性制限下においてそのようなコンパイルなど通らぬわっ!
しまった!チュドーン……
くらいいい加減なものじゃないか
小説の専門用語なんて
関数型言語の基本はなにより楽しむことだからな だってふぁn
楽しくプログラミングできる →プログラマの創造性が生かされる →良いプログラムが出来上がる →顧客増える →ビジネス成功
188 :
デフォルトの名無しさん :2011/04/24(日) 12:32:40.68
fun of programmingっていうタイトルにはそういう意図があると聞いたことがある
>>188 当たり前みたいだし短いけど、中身もあっていいタイトルだよな
関数型言語がもてはやされる理由に自動プログラミング(笑)への展望がある
並列化への親和性の高さも一つの理由だけどね。
193 :
デフォルトの名無しさん :2011/04/24(日) 13:12:10.67
自動プログラミングというか形式的手法? coqとかagdaみたいな定理証明系を利用して高い信頼性を持ったコードを書くとかそういうやつかw
急に書き込みが増えたけど、規制解除されたのか?
俺がネット再開できて興奮してるだけ
震災で鬱にならないためには楽しんだ方がいいってホンマでっかTVで言ってた。
Haskell プログラミングのおかげで就職できる場所は大学だけだと思う
Haskellプログラミングをしている人はHaskellの構文やライブラリだけに詳しいわけじゃない。 就職できるとかできないなんて低レベルな話にも興味がない。
関数型言語を仕事で直接に使うことは少ない(若しくは無い)が、 関数型言語の知識を知っていると良いコードを書けるから仕事で役に立つというのはあると思う
>>198 ハスケラー=社会性0の人ということで馬鹿にしてんのか?
>199 F#だがバリバリ製品コードで使ってるぞ(´・ω・`)
現場で一番動いてるのプログラムのソースはアセンブラ 次がC言語 次がJava 次がC++ だいぶ離れて次がBasic
>>200 Simon Thompsonが書いたErlang本を読んだ
filterやreverseを自分で実装させるあたり
教育的配慮に富んだ本だなと思って読み進めていたところ
3章の練習問題がコンパイラ作成で悶絶した
Haskellerというのは社会性がないというか
手加減を知らない人たちなんだろうな。そう思った
関数型言語やってる =計算機科学はもちろんのこと、数理論理学や情報理論などの基礎理論にも通じている =技術を使うだけではなく技術を生み出すことにも長けている =イノベーティブな技術を展開し常に業界を牽引していく人材
計算機科学と情報理論に通じてなくてもなんとかなるのが関数型言語 むしろ、計算機科学と情報理論に通じてる人にはHaskellは難しい
>>206 ハードウェア→アセンブラ→C・Java→Haskell のルートよりも、
論理学→基礎数学→Haskell のルートの方が楽
>>207 明らかに前者のほうが敷居が低い。
中卒・高卒でもなんとかなるレベル。
後者は数学的センスが無いと無理。
>>203 > filterやreverseを自分で実装させるあたり
> 教育的配慮に富んだ本だなと思って読み進めていたところ
> 3章の練習問題がコンパイラ作成で悶絶した
ワロタ
RWHで基礎が終わったな、というところで出てきた実践トピックが画像認識だったところで、オレもあせった
>>208 メモリアドレスとか、レジスタとか、スタックとかを抽象化せずに、ああやって、こうやって、こうやればやりたいことができるというパズルを解くのは、それはそれで一種のセンスがいると思う…
たぶん世間のほとんどの人はそういうパズルはとけない。
で、結局Haskell製の有名なソフトウェアはあるのかね?
>>211 そういう経験は中学・高校で済ませた。
高校時代はZ80で制御するマイクロマウスで大会にも出場したし、
あるゲーム雑誌にも自作のゲームを投稿したりした。
知識基盤がいらないテクニックだけなら中高生でも簡単に習得できるんだよ。
テクノロジーとテクニックは違う。
テクノロジーは知識の蓄積が必要で他人に伝えることもできるが、
テクニックは個人の修練でしかない。
大学では物理学を学び、大学院では計算機科学と整数論を学んだ。
大学時代はスパコンでシミュレーションプログラミングをしたし、
院卒後ある人工衛星のプロジェクトにも参加してプログラムを担当したが、
主に物理と数学の知識が役に立った。
>>215 論文を書くためにHaskellを使った例(タイトル)をいくつか挙げてくれ
それは論文を書くためにHaskellを使ったんじゃなくて、
研究のためにHaskellを利用したんだよ
Haskellを手段として行った目的は論文を書くことじゃなくて、研究だよ
>>215 は論文を書くのが目的、その手段がHaskellだと
実に馬鹿なこと考えてるんだよ
>>218 大学の研究者にとっては論文を書くのが目的
研究は論文を書くための手段でしかない(研究しない方が論文を書けるなら研究なんかしない)
Haskellはその研究の手段でしかない
研究業績とは研究への熱意じゃなくて論文の数
お前ら、大学生みたいな幼稚な会話ばっかりすんなよ
俺もその域越えたい その域を越えられたらもう論文書かなくてもいいのかな・・・
論文書かなきゃ生活が成り立たないという話が好きな人が多いな。
好きで研究すれば公開したくなる、書きたくなる 昔、先生が言ってた
どうせ学生だろ、お前ら。 学生なら論文とかくだらないこと考えてないでもっと面白いことかんがえろ。
>>217 二つ目のリストにある「Yacc is dead」というタイトルがカッコ良すぎるんだが。
中の「Cargo cult parsing」という言い回しもカッコいい。
論文は数だよ兄貴
こりゃ研究機関も仕分けだな
>>203 なんと言うか、関数型言語の本って出せる機会が少ないからなのか、入門書なのに入門書の域を越えて詰め込もうとする傾向は有るな
ちゃんと入門者向けの本、中級者向けの本、上級者向けの本って別れたら、むしろ手続き型言語より分かりやすいのに
>>207 無駄が大杉
c・java -> haskell
算数 -> haskell
で十分
んで、後者の方が楽
haskellなんぞ、算数の知識があれば十分理解出来る
カネをぶんどれる論文がいいよ。
>>231 Haskellを覚えるのが目的だなんて、貧相な奴だな。
>>233 他の知識はhaskell使える様になってから覚えれば良いだろ
初心者に知識の詰め込みを強要し過ぎ
あらいぐま haskell
ファイナルfunだしー ある日世界中に散らばってしまったクリスOkasakiの知識を集めながら、ジョブを得(ry
>>235 そういうの、あたしは嫌いじゃないな
誰か あらいぐまハスケルたん 描いて
このスレ女が居るのか
んなわけないだろ
そうか気のせいか
女ですがなにか
このスレ女が居るのか
Haskellと2chをやっている女なんて、アレだろ。 学校の成績はほどほどだけど妙に偏った知識があって、メガネで、ぼさぼさの頭でTシャツの上にカーディガンでキャンパスにくる。 合コンでは、一人でウーロンハイを飲んでいて、声をかけたら「いや、楽しんでますよ」とか曖昧な笑顔をする。 オレの嫁にしてやる。
性同一性障害の女でもない限り、haskellに興味なんか持たんよ
haskellは道具であって目的ではないからな。 haskellを目的と勘違いしているやつがこのスレには多そうだが 女は道具としてなら使うだろう。
flipって遅くなるの? それとも最適化かかる?
haskellを使ってwebサイト作ってみたいんだけど、参考になる書籍とかサイトってある? 何のライブラリを使ってとか全然分からん
>>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
この例では、最適化されると分かる。
>>248 なるほど、つまり単純なケースでは最適化かかるみたいだけど
複雑なケースではわからないから
結局の所実測してみて使うか決めるしかないんだ
一々下らない事訊くんじゃないこのうすのろ
って事ですね有り難うございました(´・ω・`)
>>247 haskell http server でググれば?
…方向性として三つあると思う。
一つ目。
UNIXのSocket(あるいはWindowsのWinSoketだっけ?)プログラミングをすでにCで習得しているなら、ちょっとした実験は、そのAPIのHaskellバインディングを使うのが簡単だろうな。
簡単なWebクライアント・プログラムを書いたことがあるが、それの動作確認・デバックのためのサーバースタブ側はこれで作った。
二つ目。
サーバーはApacheかなんかを動かして、ghcであらかじめ用意しておいた実行形式ファイルをキックする。
これも試したことある。
個人サイトでちょっと試してみたいなら、たぶん、一番簡単。
runghcをキックするスクリプトを書いて、Apacheからはそれをキックするようにすれば、事前のコンパイルも必要なかろう。
三つ目。
なんらかのフレームワークを使う。
http://www.haskell.org/haskellwiki/Web/Frameworks オレはどれも試したことない。
なんかイライラするな。 空気めないやつってよくいわれない?
はい すいません Perl忍者が最近煽りに来ないので 代わりに僕がと思いまして
>>250 ありがとう
runghcが使えるってのは便利だね
apacheからキックする方法で試してみる
Allow教えて
型を見てかんがえろ
意地悪><
てかArrowの話は過去ログでさんざん語られたはずだろ。
何だこのArrow!&&&か?
>>254 Allow じゃなくて Arrow な
Arrow の何が知りたいのか具体的に聞いてくれ
Arrowは車輪の再発明なの?
車輪の再発明の意味を調べてからもう一度おいで
>>260 Arrowと同じアイデアをArrow登場以前にHaskellで実装されていたのなら教えてくれ
自分の書いたコードが正格か非正格か判定する指針について教えて下さい
Arrowは構造化プログラミングに関しては副産物として再発明したに過ぎないの? 真の用途は?
単射とか全単射とかあるだろ。それだよ。
(´・ω・`)はい
射って翻訳するけど矢の方が的を射ているよ。 関数 f :S→Tの矢印が矢のように見えるだろ。 この矢の一般化が圏論と言われているのだよ。 別名アーチェリーともいう。
的を得る、な。
269 :
デフォルトの名無しさん :2011/04/27(水) 14:15:23.47
アーチャリー
>>268 その親父ギャグはつまんない。親父ギャグって脳の老化なんだってよ。
>>268 それマジで言ったん?ソースあんならすぐ出せ
マジなら2ちゃんねら総力上げて書き直すが
軍事:作戦指揮・統帥 法学&司法:作戦参謀 馴れ合い:兵隊召集&前線指揮 少年犯罪:少年法を盾に活動 無職・だめ:鉄砲玉要員 野鳥観察:見張り要員 vip:祭り要員 モ娘(狼):ストーキング 河川・ダム:水攻め 園芸:穴掘り要員 車・バイク:交通、特攻 オカルト:儀式 PC各種:IT部隊 ダウソ:サイバーテロ ハード・業界板:工作活動 案内:情報管理、資料作成&管理 無線:独自の通信網構築 ニュー速:情報収集 写真撮影:盗撮、記録映像 ネトヲチ:ネット監視 実況(番組):マスコミ情報確認 就職&転職:企業調査 社会・世評:世論調査&操作 男性論女性論:プロファイリング 世界情勢:世界に発信 マスコミ:タレコミ 警察:通報 アウトロー:丁寧に苦情申し立て ちくり裏事情:密告 運営:工作員排除
be:賞金(ポイント)収集&配布 議員・選挙&政治家語録:政治介入 運輸・交通:物資運搬 花火:火薬調達 科学&物理&生物:BC兵器開発 郵便・郵政:ヒットマン用衣装提供 FLASH:FLASH製作 半角二次:応援ポスター制作、漫画・アニメ系板住民釣る ダンス:応援ダンス製作 AA:AA製作 音楽各種板:鼓舞 お菓子:うまい棒補給 環境・電力:自家発電 ペット・癒し:精神安定 介護・福祉:負傷者介護 ボランティア:各種サポート 戦国時代:動かざること山の如し ネ実:現実逃避 自衛隊:最終兵器
正鵠を得るから来ているので的を得るが正しい そもそも、射るのは矢の方で的じゃない 矢を射て的を得るだ
だから、滑ってるのに。。。
そもそも、なんでinjectionやsurjectionの訳語に「射」を使ったんだろう? 写像なんだから「単写」「全写」とすべきだったのではないのか。
>>277 そんなこと考えたこともなかった。
jectがラテン語で「投げる」という意味らしいから、「写す」よりも「射る」のほうが若干違いかな。
写像を説明するときも矢印を書くべきだったな
写像はmapだから区別したかったんでしょう むしろ、injection と return をごっちゃにしてるのを問題にすべき
なんかすごい核心臭いんだが、突っ込みづらいな。
ghcのガベコレはJVMのそれの足下にも及ばないの?
Mapの更新ってミュータブルにやるの?
>>285 更新に必要な部分は、もちろん以前のものを破壊的更新せずにコピーしているはずなので、その意味ではイミュータブル。
しかし、以前のスレで話題になったリストと同じだけど、運がよければコピーしなければならない「更新に必要な部分」は少ない。
削除や追加で木のローテーションが起きなければ、「更新に必要な部分」は木の根元から更新したい葉まで一直線に結んだ部分だと思う。
ローテーションが起きれば最悪、木全部を作り直しと同じ空間コストじゃないかな。
(´・ω・`)はい
最悪でも木の高さに比例するメモリ操作で済むよ 回転一回あたりに確保されるメモリの大きさは定数で、 回転の回数は最大でも木の高さに等しい
二つの木t1 t2を比較する時に 葉同士の比較まで潜った後その上の幹に一旦戻って別の前提条件で比較 (重いので葉同士の比較が失敗した時だけ行うようにしたい)とかするには 現在見ている木の上を参照するために潜るたびに現在の木そのものを渡す つまり一つ上の木を常に保持するようにしなきゃならんのですかね?
何がやりたいのか分からんが想像で答えると、 「比較が失敗した」ことを示す値を返して、 一つ上のレベルはその値を見て対処すればいいんじゃね
なぁ結局そういうデータ構造は副作用行ける言語なら内部で副作用させてカプセル化しとけば、スピードも速くておけーとこでFAすか。
意味が分からん、まともに話せ
説明は遅延されているので、必要に応じて評価してください
継続渡しスタイルだと引数にこれからやること全部渡すんだぜ 信じられないだろ
>>293 そのギャグが面白いと思う人ってどのくらい居るんだろ
関数型言語(主にLISP)の書籍とかWebサイトで、「こんな関数も継続渡しスタイルだと末尾再帰にできるよ!」っていう紹介があるけど、ああいう書きかえって実践的に意味あるの? たんに悟りを得るための公案?
無駄に増設したメモリを使い切りたいときに役立つ
言語のスタックを使わずに実行できるから使ってるメモリ量が自明とか オレ言語のインタープリタを作ってCPSに変換するとコンパイラになるとか 意味ないな
>>296 末尾再帰にすることによって確実に処理速度が上がる言語であれば、
処理速度を上げるために多少視認性を犠牲にしてでも末尾再帰にする意味はある
たんに悟りを得るための公案では断じてない
が、本来は(というか理想は)コンパイラがその書き換えを自動でやるべきこと
例えば GHC の場合、末尾再帰ではなく deforestation の話だが、
ソース中にヒントを書いておくことでプログラマの代わりにコンパイラが
自動でやってくれる(まだまだ完璧ではないが)
Haskellは遅い C++には適わなくともせめてJavaには勝って欲しい
そうだな プログラマが工夫しなければ、まだまだ遅いな
速くなる余地がまだまだたくさんあってそれが生かされればC++やJavaと同等になるとは聞く
やたらと楽観的な見通しを述べる奴が結構な割合でいるからな
>>296 ・論文を書くときに数学的な表現を統一できる
・「これは末尾再帰で表現きるから、定理○○が成り立つ」みたいな言い方ができる
・末尾再帰専用の高速化手法がある
・というか、Schemeは全部の関数が継続渡し
開発期間から実行時間や保守費用まで全部含めて考えたとき、Haskellを完璧に理解してる人間がプログラミングすればC++にも勝てると思ってるけど、そうでもないの? 実行時間だけ考えればアセンブラ最高だし 航空機のプログラミング言語見たことあるけど、Cのソースコードにアセンブラが埋め込んであった
航空機とかエヴァのマギシステムってGC使えるの? 悠長にゴミ集めしてる場合じゃない局面があると思うの
Haskellをランタイムを含めてフルに使うんじゃなくて 型システムだけ使ってメモリ管理は手でやるとかもありそう sel4みたいにverificationのみに使うとか
形式手法が目当てならHaskellよりもっといいものが他にある
>>306 航空機の場合、悠長にゴミ集めしてる場合じゃない局面では無い時に必死でゴミ集めして、
悠長にゴミ集めしてる場合じゃない局面でゴミ集めしないで働ける保証があるなら、GC が使える
その保証を得るのが難しいと思うが
エヴァのマギシステムの場合、ヒトと同じような思考をするコンピュータなので、
そもそもGC的な意味でのゴミがゴミで無くなる
人の記憶も不要な記憶(短期記憶でさえ)がゴミとして消されるわけじゃなく、
以前の記憶やその後に作られた記憶と絡み合う
このスレの古参でHaskellに見切りつけた人っている?
>>306 MAGIはそもそもノイマン式コンピュータかどうか…
あれ、有機体を使ってあっても驚かない。
JavaでリアルタイムGCを使ってロボットを動かす研究とかあるから、いずれは飛行機のデバイスもGCを使うようになるかも。
あと、個人的には、一つ二つのユニットがGCで時間かかりすぎ→強制リブートとなっても、冗長性を保っていれば問題ない、っていう発想はありえると思う。
そういう思想は飛行機とか、医療機器とかの世界ではまだまだ受け入れられないかな。
>>309 例外的にそういう局面に急に陥る事もあると考えると
やはり危ないのでは
航空機とかは、そもそも「ゴミ」を発生させてはいけない 途中で消えるオブジェクトを用意してはならない 全部staticでメモリが用意される と昔に習った気がする
"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) のステップ数が必要に感じたのですが、 オーダーは実際には下がっているのでしょうか?
>>314 succ n = n : map (+1) (succ n)
これ↑無限ループのような気がします
>>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)時間
>>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
319 :
317 :2011/05/01(日) 07:56:37.26
>>318 む。オレの読解力が足りなかったみたい。スマン。
Haskellのプログラムを書くときは コンスセルのグラフが評価のたびに書き換わっていくイメージ で書くと良いかも。
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!
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
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...
偶然だろうけど、
>>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 も両者で同じ物だと思います)
c言語でデバッグするときは、適当にprintf文を書きますよね? Haskellでデバッグするときってどうするんですかね? putStrを挿入したら、関数の型がIOに変わってしまいますけど、他に方法ないですかね?
>>327 putStrじゃなくてDebug.Trace.traceを挿入する
MLが活発すぎてとても追いつけそうにない
>>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)
MLは終わった言語
>>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ユーザーなオレ。
haskellのメーリングリストっていう意味
英語のメーリングリストに登録してるけど、メーラーで自動振り分けしてるから、気付いたら30件くらい溜まってて読む気なくす
俺は去年の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) だと思うので、
この考え方は間違っているはずなのですが、何処が間違っているのか分かりません。
>>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 というリストですよね。
まずここまで合ってるでしょうか?
>>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)
後は、この過程の繰り返しとなるので省略。
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 にパターンマッチした後で
毎回新しく生まれませんか?
>>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)
HaskellスレはPerl忍者が入り込めない結界が張られているのですか?
構造上言うことができないだけだ。
むしろ忍者は歓迎だと思われ。 Perlは知らんが
過疎スレだからな。 Anything is better than nothing.
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 に変わったのですか?
そういえばGHCってソースをステップごとにプリコンパイルしたようなコードを出力できなかったっけ?
>>348 そうそう。
そうなる理由は簡約機械(STG)の仕様の問題だから、
その説明を読めばわかると思う。
逆にソースレベルの等式だけから理解するのは無理。
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"
という論文ではないですよね。
お前ら物知りだなぁ
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"
hlintにかけてやったら文句言われそうな括弧の使い方だな
はしゅけるしゅごい!! でそれ何に使えるの?
357 :
314 :2011/05/04(水) 15:05:53.26
少なくとも「はしゅけるしゅごい」なんて馬鹿にして理解する気の無い人に分かるわけがない 即刻消えなさい
うちわで盛り上がるのに使える
正規表現のマッチがボトルネックだった(!)ので regex-posixをregex-tdfaにしたら爆速でワロタ
>>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"
素直な人 f (g (h arg)) 普通の人 f $ g $ h arg 性格が捻じ曲がった人 f . g . h $ arg
>>361 なんでw
f.g.hを一つの関数に見立ててargを渡してるわけでしょ。
性格曲がってないし、普通だし。
(\x -> f.g.h x) arg
>>361 あと、f$g$h argだと再利用性が悪いじゃん。
arg が IO とかついていた場合だと f . g . h <$> arg ってほぼそのままいける f <$> g <$> h <$> arg はちょっとしつこい
>>364 がツッコんで欲しそうにこちらを見てるんだが、どうしようか
始対象厨: f . g . h . const arg $ () プログラム全体を定数にするとなんか嬉しかったりすんのかな?
>>352 どちらの質問もyes
最後については、その論文でもいいと思う。
最新の実装とは少し違うかも知れないけど、基本的な考え方は同じはず。
説明もわかりやすい。
370 :
314 :2011/05/04(水) 23:33:17.54
>>369 おつきあい頂きありがとうございました
結局この論文しか見当たらなかったので今読んでいる最中です
isInfixOfってStringだと順番にしらべていくだけなんだね ByteStringだとKMPだった
>>370 Haskellの仕様には載ってないとはいえ、
「サンクの内容は一回しか評価されない」
というルールを満たす処理系ならどれでも同じ計算量になるよ
紙の上でグラフ簡約を追いかけるだけで十分理解できる内容で、
STG論文はこの話に関係ない詳細が多すぎて明らかな遠回りだと思う
ghc -fext-core で確認すれば一発だと思います
いやCoreを見たって構文糖を削ぎ落とされたソースが出てくるだけだろ
>>374 構文糖を取る以外にも、ものすごく変な最適化してる
376 :
314 :2011/05/05(木) 09:40:06.90
>>372 ノートに何度も図を描いて簡約の様子を考えてみたのですが、
どうしても理解できませんでした
俺スクリプトの一行目が#! /usr/bin/runghc ばっかりになってきた
>>377 そのまま、全てのコマンドがhaskellで書かれたThis鳥作って出してくれ
30行くらいの書き捨てプログラムをコンパイルして バイナリのサイズが12MBとかになるとがっかりする
書き捨てプログラムなのにバイナリの大きさが重要なの?
バイナリのサイズが小さくならないのは、Haskellの仕様の問題なのか、GHCの最適化手法がウンコだからなのか それともバイナリのサイズにこだわることがウンコなのか
性的リンクだからじゃね
main = return () だけだと 847K (strip すると 584K) だけど 単純に gtk hxt regex-tdfa haskeline parsec を import するだけで 36M (strip後20M) に膨れ上る
逆に言うと、コンパイルしたらexeファイルだけ持っていけばOKってこと?
バイナリのサイズを小さくしたかったらFFI
ghcのデフォルト設定って静的リンクなのかよw
あ、よく考えたらマイナー言語の場合はそっちの方が都合がいいのかもな 軽量な書き捨てプログラムはrunghc使えばいいし
使うかどうか解らないからライブラリをダイナミックリンクするんじゃないの? コンパイル時点で何を使うかはっきりしてるんだから静的リンクじゃん?
ごめんなんでもない
実行ファイルでかいなあと思ってたがそういうことか
ただでさえ重いHaskellが仮想機械上で動くようになったら Javaどころの贅肉じゃなくなるな
Javaはポータブルなバイトコードだから思い ネイティブなバイトコードを仮想機械で動かせばそれなりに早くなると思う
何の話でしょう?llvm?
>>392 実行速度とサイズは反比例するんですが。。。
まあ、理屈で言えばhaskellがc言語並に速くなるには、もっとサイズがデカくなる必要がある訳で
参照透明性が有るって事は、究極の最適化は、同じ関数に同じ引数が与えられたら、2度目以降は計算すっ飛ばして値が帰ってくるようにする事
実行された全ての関数の、全ての引数に対応した値が保持されるのが、究極の最適化
いくらメモリが有っても足りないから、現在の実装はそう言う実装じゃ無いだろうけどね
64bitOS向けに最適化進んだら、そう言う日も来るかもしれない
rubyやpythonの本はないのに、RWHがある図書館てコジャレてる。
>>395 それ、普通にメモライズとかメモ化って呼ばれてるテクニック
>>397 言いたかったのは、テクニックじゃなくて、参照透明性が確保される事による、適用範囲の(理論上の)範囲の広さ
>>397 64bitOS向けに最適化進んでも、そう言う日は絶対に来ない
IOストリーム(IO無限リスト)は
Haskell で一般的に(例えば FRP などで)使われるテクニックだけど、
それがあなたのいう究極の最適化方法では最適化できない
メモリが足りないというレベルではなく、根本的に不可能
>>396 羨ましい。近所の図書館にはRubyの良書しかないな。
あと言語とは関係ないけど「WinMX完全ガイド」みたいな題名の本が図書館の棚に並んでるのを見ると、毎度何とも言えない気分になる。
>>400 うちの近所の図書館にはrubyやpythonの本もRWHもある
依存やらglibcやらでwindowsでyiのインストール出来ない 誰か教えて下さい
403 :
314 :2011/05/07(土) 13:43:52.80
おかげさまで、O(n) の計算量で済む理屈を納得することができました。 ありがとうございました。
>>402 諦メロン
cairoフロントエンドはgtkとかのバイナリ取ってきてできたけどどうも動作が怪しい
vtyはフルスペックのncurses(pdcursesじゃ無理ってこと)がwindowsでは使えないから無理
公式はvteフロントエンド推奨だけどvteのビルドにフルスペックのncursesがいるので(ry
win32パッケージを使ってgdiフロントエンドみたいなものを作るしか無理!
でもそんなのできたらその日からyiのコミッタになれると思うよ!
>401 美学ってのがないn いや、うらやましいです。 他の分野より新陳代謝が早いからコンピュータ本を抱えるのは大変だろうなー。
RWHはオライリーの電子書籍が半額の時に買ったけど PDFは本当に楽だねw
>>405 ところが全然「新陳代謝」しないんだよ
同じ棚に Python 3 の本とか、OpenOffice 1.0 の本もある
いい加減書庫に葬れよって思う
Python3を葬るのは早くないだろうか…
python3はなかったことに・・・
Grapefruit ってサンプル見てもさっぱり、さーっぱり意味が分からないんだが どこかに解説ってないの?
ファンクション倶楽部秋イベントを開催します。 オブラブメンバーの中に潜んでいたLispやHaskellをこよなく愛するファンクショナリスト3名がオブジェクト倶楽部へ反旗をひるがえし、 「オブジェクト倶楽部秋イベント」ならぬ「ファンクション倶楽部秋イベント」を開催。 己が信じる関数道を熱くそしてフリーダムに語り尽くします。
俺はCLOSの影響かlispってオブジェクト指向ってイメージ強いや
>>411 せっかく紹介してくれたのにゴメン
根本が理解できない俺の能力では論文もリファレンスも無理だった
まだ研究レベルのGUIライブラリだと思って諦めるわ
>>414 気にすんな
どうせ2,3年もたてば、いつものように開発放棄されるさ
もうとっくに放棄されてる
最後に頼れるのはgtk
>>417 その上に構築するGUIライブラリの話なんだが・・・
>>418 おまえはいつもそうだ
結論を曖昧にすることで、正しいことを言っているような印象を抱かせる
「その上に構築するGUIライブラリの話」だから何なんだい?
>>419 > おまえはいつもそうだ
意味が分からん
実際に正しいことを言っているような印象をお前が抱いたのなら、それでいいと思うぞ
間違っているという印象を抱いたのなら、その部分を指摘して質問してくれ
で、実際はどっちの印象を抱いたのだ?
Grapefruitに代表されるGUIライブラリは、
関数型らしくできるだけ宣言的にGUIを構築できるようにするために、
Gtk2HsやwxWidgetsに被せるラッパーだ
Grapefruitの目的が分かっていれば
「関数型らしくできるだけ宣言的にGUIを構築できるように」
これを前提とした話をしている事は自然と認識できると思うが
最後に頼れるのはgtkなどと次元の異なる発言があったので指摘した
ライブラリを使う「目的」が全く異なる
ある程度の厳密さを求める話題に対して一行レスして、騒ぎになるのが2ちゃんねるですか。 ここぐらい多少のアカデミックさがあってもいいんじゃない?
アカデミックは妥当じゃないかな。理性的ですね。
最近Haskellへの興味が薄れ、XMonadじゃない他のWMを試してみようかと思ったんだけど、 scrotwmとか、設定ファイルにミスがあると挙動が分からなくなる。 コンパイルできたらほぼ確実にまともなプログラムとして動くってのは確かに便利だと実感した。 普段は型エラーがうざったく感じてたが、ナメてたわ。
お前ら必要あんの?
Haskellって別に人数重要ってわけじゃないよね
労働みたいに重いものを運ぶから〜〜人必要って
秀才君は全部一人で作っちゃうよね まして君たちカスじゃ
相当できるやつ以外君たちクズはHaskellやらなくていいんじゃない?
知的好奇心を満たしたいなら一人でやってればいいと思うけどマジゴミみたいだね
まぁゴミみたいだね なんていうかゴミみたいですね カスだね
http://d.hatena.ne.jp/Minamo/20090329/1238345734 こいつ目的ゲーム業界なのにHaskellやっちゃって頭にウジわいてるんじゃないかな野菜のクズっておもいました
だからお前ら死ねってことだ
自己紹介が長いとあまりいい印象は持たれないよ もうちょっと自分の特徴をまとめようよ 一言で表せると最高だ
寒いから帰って良いよ根菜のクズ君
寒いってお前のことね426さん
>>426 3行でまとめず、1行でまとめような よしひろちゃん
見事な春厨だ
見事な厨厨
次のオラ本の表紙はあらいぐまにケテーイ。
アライグマ・動物(笑) シュシュシュ! ドラゴンとか使わないんすね オライリー! シュシュ かっこいいっすよ! ドラゴン シュシュ! シュシュシュ ヘラクレスオオカブトとか意味わからないかっこつけてるんでしょうが シュシュシュ 変ですってあれ シュシュシュ なんていうすかね シュシュ ひねったあげくあんな昆虫なんすか? シュシュシュ 意味わからないって シュシュシュ 寒いっすよ オライリーさん シュシュシュ パネーッス!!
シュシュシュ
ソイヤッ!ハイッ!ハイッ!
シュシュシュってナニをこすってる音なんですか?
機関車の音です
卑猥っすね
IDないからやりたい放題だな
プログラミングHaskell買ってきた。 ふつうのHaskellは知りたいことが全部後回しでイライラした。 問題はGWが終わったことだ。
愚痴じゃなくてHaskellの話題を書き込めよ。 死〜。
Perl忍者はこのインターネットに潜む脅威 危険度 重大 彼は非常に、ネットの立ち回りがうまい。 攻め際と引き際がうまく出来ている。 一度食らったら、いったん引いて攻防を繰り広げており 勝てると思ったら全力で攻め続ける 素晴らしい戦闘スタイル 逃げ際には逃げうちで煽りを入れてから逃げる。 いったんネットの闇に身を潜め、チャンスを伺う。 彼は心理的要素も熟知しているため、炎上の仕組みまで理解している。 そう簡単に崩されることはない、その体制こそが、Ultimate Order アルティメットオーダー(究極の体制) そして、いつ襲ってくるかわからない暗殺の脅威 危険極まりない人物こそがPerl忍者だ。 Perl忍者を追撃したところで、煙玉を巻かれて遁走のがオチだ。 Haskellスレではsuwabuki,イマイヨシヒロが犠牲になっている。
錯誤が拡大する。
かっこいい名前だな アルティメットオーダー。
ここの人はPerl忍者さんに親切ですね 忍者さんはLL系の人達からはほぼ無視されています Perl忍者さんを脅威に感じているのでしょう、なので敵対してます 彼らは余裕がありません、忍者さんに追いつかれたらまずいので教えようともしません 何も教えたりしていません彼らは、自分が追い抜かれたら大変なので ”常に下を作る”ことをしようとします、ですが忍者さんは彼らより優れています 私はそう思います Haskellスレの方はアルカディアサーガスレの人たちより親切ですね ここはPerl忍者さんにとって、第二の理想郷でしょう 皆さん、暖かくPerl忍者さんを迎え入れてください 最近忍者さんが2chに来ないのは、LL系プログラマからいじめにあったことです 彼はそのショックで引きこもったままです 2chに来ようとしません ”IRCのBAN、無視、LL系プログラマの嫉妬”により立ち直れないほどの心の傷をおったそうです ですので、Perl忍者さんが来たら暖かく迎えましょう
442の書き込みは、たぶんPerl忍者さんでしょう いじめにより、脳みそが大トロ化してしまったそうです それにより、思考力が低下し自作自演・妄言が激しくなり 引き篭もり、24時間体制で2chをやっていると聞いております 場合によってはPerl忍者さんは精神病院に隔離される場合があるので 大事に扱って下さい、Perl忍者さんと会議通話をしていたのですが 同じことを何回も繰り返しておりました、”シュシュシュ!! シュシュシュ!!” と意味不明な言葉を発していました、とても不気味でしたがLL系プログラマから嫉妬をうけたあげく、いじめられたのが原因だと思って そっとしといてあげました。 先ほど述べたIRCのBANというのはsora_hさんに嫉妬をしてチャンネルを荒らしてしまったのでしょう そのせいでBANを食らって精神的なストレスにより、余計頭が狂ってしまったそうです なんかいも、私にIRCでBAN解く方法を教えてくれ と狂ったように100回くらいメッセージを送ってきました これはダメだと思い、病院に隔離してもらうようにサイバー警察に相談しました
テスト用のゴミプログラムのソースファイルが1000くらいあるんですけど、上手な管理の方法ないですかね? 現在は 20110509glutTest.hs みたいに日付をつけて一つのフォルダに放り込んでます。
よく分からんが普通にソース管理ツール使えばいいんじゃないのか?SVNでもGitでも
それらはソース管理ツールじゃなくて、コンテンツのバージョン管理ツールだよ
450 :
デフォルトの名無しさん :2011/05/10(火) 10:20:35.75
>>447 タグで管理できるようなツールを拾ってくるか作るとか。
ツールを使っても、おそらく今の意識のままだと管理できなくなると思う ちょっと回り道してでも整理術を学んだ方が結果的には早いのでは?
ゴミなんか管理しなくていいだろ 全文検索ソフトを入れておけばおk
全文検索の用意するのも面倒だからemacsのfind-grepに頼りきり
お前らゴミがバージョン管理ツールとか使っても まじいみねえから きもちわりいんだよ デザインテロとかやってろよはげ
ghciへの入力とかコンパイルコマンドとかの入力履歴を時系列でとにかく全部記録しておきたい ghciで入力した文をコンパイルできるhsファイル1つに全部保存できたらいいんだけど、名前が競合するから、日付ごとに作ったファイルに入れてる モジュールとか作るときは日付がないファイル名にするから管理が面倒くさくなる
そんな同でもいいことに時間費やしてるおまえはマジクズ
このスレってアカデミック色の強い言語に似合わず糞スレだよね
ソフトウェアは超大量生産できるから、どうでもいいことでも、大変なことになる
アカデミックと思っているのは数学が苦手な低学歴な奴だけだろ
論文のためだけに書かれたメンテされてないライブラリの山を見れば そういう言語なんだなあと
oneiric language
>455 rlwrapが便利だと思われる。$ rlwrap ghci で普通にghciが使えて、$HOME/.ghci_historyというファイルに履歴が残るよ。
>>447 Haskellの人ってみんなdarcsかmercurial使ってると思ってたけど違うのかな。
>>460 例えばどのライブラリ?
論文とその実装がセットで公開されているのは意外に珍しいから
煽り抜きでマジで興味ある
ライブラリ名とその論文を合わせていくつか教えてくれ
460じゃないが、上で挙がってるGrapefruitとか?
elereaがシンプルだし読みやすいのでおすすめ 論文も結構新しい部類だし、なんといっても分量が少ない しかし論文とセットのFRPといえばやっぱ本家であるreactive そしてしばらくメンテされてないという条件も満たしているwwww FRPはCCAとstream fusionを使って強力な最適化ができるということが二年ほど前に示されたけど このCCAなんと条件分岐ができないという欠点があるんでこれを克服したなんかが出ない限り前に進まないだろうなと予想している FRPはC#のRxとかいろんな分野で広まろうとしているネタではあるのでこのまま死に絶えることはないと祈りたい
個人的には Conal Elliott は信頼してる きっと克服してくれる
Haskellを使うメリットは何ですか?
無限リスト
基本的には副作用が無い事。
お前らのクズ親もクズHaskell使いのお前らもかわいそう
Perlスレでメモリ管理のこと話したがってるC齧りたてのバカが 「Perlで常駐プログラムでメモリ管理」みたいにわめいてるんだけど 本とバカだと思う本当に
一般項ではなく漸化式で計算される数列の要素を持つリストがあるとします。 例えばフィボナッチ数列のリスト [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 モナドとなる。 他に方法はあるでしょうか。 (例に挙げたフィボナッチ数列は一般項が計算できますが、 今回の問題では一般項は計算できない前提でお願いします)
無限リストにすればいいじゃない
最近、気軽に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 の前者の解決方法「持ち回し」と本質的には同じですよね。
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 の対象になって欲しいです。
こういう仕組みを作るのに参考になりそうな論文などは無いでしょうか。
質問が曖昧すぎでしょうか?
>>479 その要求(不要な先頭要素のGC)を満たすには何らかの方法で状態を扱うしかなさそう
StateでもIORefでもいいけど、無限リストの組み合せで実現するのが比較的シンプルだと思う
つまり(a0,b0):(a1,b1):...という無限リストをStateなどで引き回して、
値が必要になったらdropWhileで精度の足りない部分を捨てて使い、
それ以降の部分を新たな状態とする
>
>>474 の前者の解決方法「持ち回し」と本質的には同じですよね。
無限リストをグローバルに定義するだけなら引き回しは必要ないよ
この場合、「必要ない要素のGC」は実現できないけど
最急降下法のような反復的なアルゴリズムで値を求めていて、ある場所では少なくとも n1 回の反復が必要で、また別の場所では少なくとも n2 回必要なときに、 無駄な計算を省きつついいかんじに過去の値は捨てていきたいって話…?
メモリ消費が問題になるなら、たとえば反復10回につき一要素しか持たないようにすれば、 グローバルに無限リストを持っても消費メモリは1/10になる その代わり必要な精度を超えた反復が最大9回分発生するけど
そういうのこそ副作用使えれば一発だな。 精度を表す指標と値のタプルををCurrentで返すようにして必要あればProceedで必要なとこまで進める。
484 :
473 :2011/05/13(金) 20:57:19.82
結局、たとえ IORef を使おうが、その IORef で包んだデータを持ち回さないと、
別の場所でその途中の精度まで計算した所の続きから計算し始めることができないんですね。
それは継続用の関数を戻り値として戻してても同じ。
その「持ち回し」というのが、つまりは状態を扱うという事なんですね。
グローバルで状態を管理しようが、一部ローカルで管理しようが、
状態を扱う仕組みとしては同じ事。
あれこれ考えるのは諦めて、素直に State か何かで状態を扱う方向で検討することにします。
ありがとうございました。
>>481 きっとそういう事です。
あかん、haskellwiki読んでもhxtの使い方がさっぱりわからん…… Arrowについてあらかじめ知らなきゃ駄目なのか俺の読解力がないのか。 一番シンプルなXMLライブラリって何でしょうか?
すんません ↓はカウントアップする関数なんですけど、 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 に整数が入る理屈が分かりません
>>486 モナドクラスのインスタンスなのは (State Int) 型です。
M をモナドクラスのインスタンス、f の型を M A としたとき、
do { x <- f; ... }
で x の型は A なので、もし M A が State Int Int 型ならば x は Int 型になります。
>>486 説明しようとして get を展開して
n <- ( State $ \s -> (s, s) )
と書いたらこっちも分からなくなった。
>>488 それは、中にある組(s,s)のうち片方だけがnに束縛され、もう片方は捨てられるんだったと思う
getでは同じsなので違いはわからんけど
putの場合は以前のStateの(s,a)の中身は両方捨てて、putへの入力値と()のセットで新しく上書きするので
それで動作を調べたらいい
あと、自分が以前に質問したときは、新しいバージョンではStateコンストラクタは見えなくなり、
今はstate関数になってるって話だったよ
State s a型の場合、組の部分の値を型で表すと\s -> (s,a)ではなく\s -> (a,s)と逆順になってるのは理由があるのだろうか
覚えにくいからいつも忘れてしまう
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の実装も関係してくるのだろうか
>>486 理屈を分かりたいなら、do記法の糖衣構文を解除(?)して、>>=と>>に書き換えたほうが良い。
>>490 非常にナンセンスな疑問に思えるが、ご想像通り、>>=の実装に依存する。
>>490 そうだと思う。
自分にはStateモナドより、引数に状態を持ちまわる関数のほうがよっぽど使いやすい
Stateを使うと自分で手錠をはめているような感覚になるんだけど、
慣れた人はちゃんと使いこなしてるんだろうか
そこは結構な疑問
モナド変換子を覚えると違うの?
引数のひとつと返り値(タプルによる多値)のひとつをget put用にするのがStateモナド。 結局引数もちまわりとやってることは変わらんが、 モナドに抽象化されているので、モナドの種類を変えたりTransformerをかぶせたり といった操作をしやすい。 複数の関数の引数に同じものを食わすのを隠蔽するのがReaderモナドだし、 複数の関数の返り値のひとつを集めるのがWriterモナド。 関数を (入力の数) -> (出力の数) と表すと Stateモナドは 2 -> 2 を Readerモナドは 2 -> 1 を Writerモナドは 1 -> 2 を それぞれ (a -> m b)という型の 1 -> 1 なモナドの世界の関数として扱える方法という感じ。
>>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
自己解決しました。 後続の方のために説明したいんですが力量不足でうまく説明できないです、ごめんなさい。
do構文の <- の展開方法を見たら複雑すぎて吹いた。 モナドを剥して変数を取り出すだけじゃなかったのね。
499 :
デフォルトの名無しさん :2011/05/19(木) 12:17:46.81
内包表記で [x | x <- [1, 2, 3]] と記述したところ|が駄目らしくannotationsエラーが出てしまいます。 開発の環境が悪いのかなとも思いcodepadでも走らせてみましたが駄目でした。 何故でしょうか
>>499 それと全く同じコードをghciに入れたら普通に動いたよ。
他の部分に問題があるんじゃないか
>>499 それって、ファイルに直接記述してるんじゃないのかな。
n = [x | x <- [1, 2, 3]]
とかやって、bind するとかしないと、haskell のソースコード 的には、おかしい。
あと、codepad では、main が必要みたい。
haskellwikiに書いてあるやりかたでwxWidgetsをMinGWでビルドしようとしているんだが、 メモリ使用量がすごいせいかldが落ちる…… MONOLITHIC=1とか無茶だろこれ。 オブジェクトファイルだけで500MB超してるんだぞこれ。
503 :
502 :2011/05/20(金) 17:53:26.21
500MBは言い過ぎかもしれないけど、400MB位は多分ある。 スレ違いすまん。
たった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にします。
ldにパッチあてるとか
windowsの原因不明なメモリ不足なら/3GBオプション有効にしてみるとか
>>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引いた分しかないので効果があるかどうか。
また時間があるとき試してみます。ありがとうございます。
>>511 > tarボールはcabal unpackで簡単にもってこれる
これは私も知らなかった
簡単でいいな
素直にWindowsパイナリを落とさない理由を知りたい
Windowsバイナリだとwxパッケージのインストールに失敗しないか?
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*) と書く方法を教えてください。
map' xs f = map f xs
>>519 let fun = flip map
[1..3] `func` (2*)
`(flip map)`とかできないの? ghcのドキュメントみても載ってなかった
現在のHaskellでは無理
部分適用したかったら、一度バインドする必要があるということでいいですか?
はい
>>524 バインドしなくても部分適用は出来るよ
確認したかったら、ghciで型を調べると良い
(値が無いので、値の表示はエラーになる)
前にこういうのが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)
Haskell書くたび顔文字増えるね
>>527 この場合、infix 0 っていうのは、何でですかね?
もっと、強い結合のほうが、使いやすくないですか?
readFileとかって今でもUTF-8でするためにはutf8-stringを使わなきゃ駄目なんですか?
>>530 俺も貼ってからそう思った
>>531 今のGHCだとreadFileは現在のロケールに従う(ただしWindowsだとマルチバイトは未対応のはず)
UTF-8を指定したければopenFile, hSetEncoding utf8, hGetContents
C++のテンプレート特化に相当する機能無いの? Map aでaがIntだった時自動的にIntMap使ってくれるみたいな
7.14.5 Specialisationかな
あり^^
しかし特殊化したい関数にRULESを付けるだけでなく その呼び出し元にまでSPECIALIZEが必要
面倒くさいのぅ
>>537 >>535 を見ると、特殊化したい関数にRULESを付けるだけで、
呼び出し元については特に何も書かれていないように見えるんだが
>>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が呼ばれる
>>540 foo を直接呼出す baz の段階では x の型は確定しないけど、
ほとんどのケースで型推論によって Int かどうかはわかるんじゃないか?
実行時まで確定しないケースってどんなとき?
>>540 ,541
「実行時」には型はかならず決定しているね。
でも、コンパイル時、つまりオブジェクトファイ生成時に不明であればfooが呼ばれてしまうというのはそのとおりだと思う。
Mapを多相なままさらにラップしなけりゃ発生しない問題であり、仮にラップしてもインライン展開されれば問題ないと思うが、そういうことを意識しないといけないのはスマートじゃないね。
543 :
531 :2011/05/22(日) 18:55:11.22
>>533 何がしたいのか知らんが、型宣言しとけば良いだけじゃないか?
>>533 GHCならtype families拡張とか
型族さんってそういうこともできるのか知らなかった
548 :
デフォルトの名無しさん :2011/05/24(火) 00:24:34.30
一様初期化というか、 data Pt = Pt {x,y::Int} v = [1,2] p = Pt v!!0 v!!1 と同じことをやるイディオムってあるんですか? 配列のサイズが大きくなると大変だし、!!は使いたくない・・
foldrっぽいんだけどなぁ・・・
GTK+3になってからGDK関係で消滅した関数が大量にあるけど、gtk2hsはその辺どうなるんだろう。 まだGTK+2用だけどそのうち3にも対応するのかな。
>>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))
この1/xの関数のグラフのような形のコード・・・ こういうのが並ぶとうねりコードになるんだよな かといって圧縮すると一行が200文字コードになるし この辺は仕方ないの?
仕様です
そりゃ仕様がないななんつってなガハハ
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を使えば大改善するかもしれん。
C++で書かれたライブラリを使いたい場合ってもしかして一旦Cでラッパーライブラリ書いて、 DLLにして、それをさらにHaskellからリンクして使うことになる?
うん 別にDLLにする必要はないが
561 :
559 :2011/05/24(火) 21:41:06.14
>>560 やっぱそうするしかないのか。
そうか……ありがとう。
C++へのバインドってどうやるんだろうと思ってqtHaskellのソース見てて驚いたんだ。
>>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) と考えるべきなのでしょうか?もしくは どっちと考えても一緒。なぜなら結合法則が一緒であることを保障してるから。 なのでしょうか? 何を見ても、このへんあんまりきっぱり書いてない気がするもので・・・・
ps :: [FilePath] というリストをディレクトリとファイルに分けたい (ds, fs) = partition doesDirectoryExist ps もちろん、これはエラー(doesDirectoryExist の戻り値は IO Bool だから) こういう場合、どうやるのがスマートなんだろ
>>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 =<<
詳しい内容は、検索でもしてください。
>>563 > 引数2 (funcB >>= funcC)という式(a -> m c)
これはありえなくね?
567 :
559 :2011/05/25(水) 20:47:03.95
>>562 なるほど、両方試してみて、楽そうなほうにしてみる。
ありがとう。
>>563 前者は誤り、後者は何を言いたいのかよくわからない
funcA a >>= funcB >>= funcCは
((funcA a) >>= funcB) >>= funcCと解釈するので
ひとつ目の>>=の第一引数は(funcA a),第二引数はfuncB
二つ目の>>=の第一引数は((funcA a) >>= funcB)の結果、第二引数はfuncC
結合法則が成り立つので前者のように考えても良いよね、という質問だとしたら
モナド則を全ての実装が満たしている保障はないので、そういう風に交換するのも無理
よく使うモナドはモナド側を満たしているだろうけどね
HaskellでのGUI開発関連の最新の情報はどうなっているんでしょうか? FRPはwxFruitもGrapefruitも開発が続いているようには見えないですが、他のFRPライブラリはどうなんでしょう? また、FRP以外のパラダイムも研究されているんでしょうか? あと、FRP関連の論文を少し読んでみましたが既存のパラダイム(例えばgtk2hsのようにモナド内でdoを使ってimperative的にする手法) の欠点が指摘されているものが見つからなかったのですが、例えばgtk2hs的な手法の問題点はなんでしょうか? って?ばっかりになってしまいましたが教えてください。
570 :
uy :2011/05/25(水) 22:09:21.68
ゴミみたいな言語だしな・・・ こんなゴミみたいな言語でもdllは読めるんだろ? だったら自分でCでGUIライブラリ書けよ・・・ゴミなんだからさ・・・・・・・
>>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に記述するとひどく読み難い
一つの関数の定義が縦に長くなるし、タブのネストが深くなりがち
確か、最適化も働きにくくなると、どこかのブログで読んだ気がする
>>570 問題を勘違いしているのだと思うが、
GUIの基盤となるライブラリなら gtk2hs や wxHaskell など既にある
一方、Haskell Committeeはストリームや継続による宣言的なI/O をやめてモナド(do構文)に移行したのであった
>>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 ここにある「正しいモナド」でないモナドもアリなのでしょうか?
「ナシ」なら、右結合でも左結合でも、どっちでも好きなように解釈していい、
ということになると思っているのですが・・・
ま、命令的に書く方がいいものもあるってことだ
>>537 ・継続渡しは決して宣言的に書ける訳じゃない(ストリームは知らん)
・そもそもこれに関して言語とライブラリは全然違う
言語は宣言的な記述と命令的な記述を両方サポートしないと使い物にならない
ライブラリはその問題領域において優れた記述方式だけをサポートすればいい
>>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))
>>571 Haskellは命令的なコードも問題なく書けるようになってる
一般論として命令的に書くのが悪いなんてことはない
>一つの関数の定義が縦に長くなるし、タブのネストが深くなりがち
こんなのはお前のコーディング能力の問題
GUIで宣言的プログラミングの探求が盛んなのは、
そうした方が綺麗でモジュラー性が高いコードになるという感触があるからだろう
不用意に一般化してはいけない
>>580 > こんなのはお前のコーディング能力の問題
「個人的には」から「深くなりがち」まで一文は
私の個人の能力に起因する私の個人的な感触を言ったまでなのに
そんな言い方はひどくないか
そうした方が綺麗でモジュラー性が高いコードになるという感触があるのは
GUIに特有の、GUIならではの性質なのか?
私は決してGUIだからでは無いと思っている
imperativeよりdeclarativeを目指しているのは分野ばかりではない
パーサー関連は昔からdeclarativeを目指してるし、
GUIに無関係にFRPはよりdeclarativeに向っている
HackageDBでいろんなライブラリを見てみれば分かるが、
できるだけdeclarativeにプログラムできるような仕組みを提供するものが多い
確かに何もかもdeclarativeに書くのが良い訳ではない
しかし、declarativeを目指してる分野は
「不用意に一般化してはいけない」と言うほど特殊でもない
>581 FRPは状態とその関係性をよりdeclarativeに書くための仕組みだし、別にGUIに特有ではないと思うよ。 GUIが特殊というやつは正直いけぬまだと思われ。 GUIは各インスタンスが状態を持ちその状態がイベントにより遷移し連動するという側面が強く出ているだけでほかのプログラムも同様。 すべからく一般化すべき対象と思われ。
すべからく見よ
しばらくHaskell漬けになってたら、Cのライブラリとかでグローバル変数使ってる副作用バリバリのライブラリ見ると 一瞬ん??ってなるようになった。
>>584 ああ……標準化されてるけどムダに副作用バリバリな関数使うかMS拡張だけど副作用のない関数使うか迷う
まあ大抵後者選ぶんだけど。標準化されててもクソなものはクソだわ
>>584 久しぶりにCのプログラムすると、
関数の呼び出しでコンパイルエラー喰らって、
なんでエラーが出るのかしばらく悩む
エラーメッセージが意味不明なのはC++くらい それに比べたらHaskellもCも優しい
do構文はa1 >>= (a2 >>= a3)と右にまとめるのに a1 >>= a2 >>= a3とかくと (a1 >>= a2) >>= a3と左にまとめるのか。 なんでどっちかに統一しなかったんだろう? 結合的でない>>=を書いたら、思わぬミスをしそう。
>>589 よくわかってないから違ってるかも知れないんだけど、
そもそもモナド則を満たしてない似非モナド?が悪いんじゃないの?
>>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などの副作用を入れて観測しない限り結果は
同じになりますから、結合側は満たしていると考えるべきなのでしょう。
お付き合いくださってありがとうございました。勉強になりました。
Haskellに足りないもの それはscalaやerlangのようなメッセージパッシングのサポート 純粋であるというのはつらいことだね
>>593 Control.Concurrent.Chan使おうぜ
596 :
569 :2011/05/28(土) 02:16:16.93
>>571 ありがとうございました。とても参考になりました。
>>581 >そんな言い方はひどくないか
「個人的にはAだ」と言われたので、
「なるほど。でも普通はAじゃない」と返しただけ
現状手続き型言語が圧倒的に主流で、既存ライブラリの設計もそっちに激しく偏ってるから、
それを基準にすればHaskellライブラリの大半が宣言型を目指していることになる
しかしだからといって命令的プログラミングを軽視したり「Haskellらしくない」なんて罵倒するのは正当化されない
優れた宣言的手法が存在しない/知られていない分野なんていっぱいあって、
そういう場合は堂々と命令的に書くべきだし、それができるのがHaskellじゃないか
というかHaskellの命令的側面は軽視されすぎ
軽量スレッドのインタフェースは使い易いし、実装も優秀
低レベルのメモリ操作ができる一方でiterateeみたいな高レベルの抽象化も扱い易い
こんな言語はなかなかないと思う
「優れた宣言的手法が存在しない/知られていない分野」ってどんなん?
リアルタイム処理とか
GUI
割り込み
>>597 GUIでは宣言的の方が綺麗でモジュラー性が高いコードになるという感触があると言う
一方で宣言的手法が存在しない分野もあると言う
両者の本質的な違いって何だろ
例えばこの分野には宣言的手法がありそうだと目星を付ける指針みたいなのってある?
やってることが逐次的なものかどうかじゃね?
システム側というかコード側以外にに実行トリガを委ねられるってことか? となるとGUIとかはOKだけど、数値計算は…宣言的に書けるか…。 どこが割れ目かってことかね
>>597 書いていることの大筋には共感するが、
>>580 は喧嘩腰すぎ(同一人物だよね)
>>604 > どこが割れ目かってことかね
えっちぃのはいけないと思います!
XやWin32のイベントドリブンな枠組みは宣言的なのか?
基本的な質問で恐縮ですが 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
610 :
607 :2011/05/28(土) 22:41:39.92
>>609 ですよね
ありがとうございます、安心しました
>>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するコードが生成されるんですか
>>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するようなコードが生成されると期待しましたが…
>>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)にすることはないはず
(規制のため分割) 詳細は「Let-floating: moving bindings to give faster programs」 ソースが見づらくなる問題については、where節を使うと良いと思う f x = \y -> member y s where s = insert x 1 empty
ハスケルたんのことが大好きすぎてWEBアプリ分野でscalaを倒してほしい
twitterを超えるwebアプリをHaskellで書いてくれ
JVM上でhaskellが動いたら勝機も見えてくる!
>>619 研究はされてる
"Compiling Lazy Functional Programs Based on the Spineless Tagless G-Machine for the Java Virtual Machine"
"The Architecture of the Utrecht Haskell Compiler"
など
Lispですらまともに実装できてないというのに…
待ちたまえ Lispの方が実装し易いと言いたいのかね?
623 :
デフォルトの名無しさん :2011/05/30(月) 22:51:48.59
1週間前からhaskell弄り始めた。なんとなく文法覚えた程度でモナドとかはまだだけど、なんか楽しいね 数式っぽく書けるのが気持ちいい♬
圏論が勉強してないから気持ち悪くて使う気しないのは俺だけ?
ベテラン先輩Haskellerとして一言、圏論関係ない
囲碁将棋ジャーナルでハスケル将棋ってやつがコンピューター将棋大会に出場してたけど これで作ったんだろうね。
cabal でインストールしたパッケージのドキュメントを アンインストールする方法は無いでしょうか ドキュメントをインストールすると、今までのドキュメントに インストールしたパッケージのドキュメントが融合されますが、 それを全て融合前の状態に戻したいです あと、パッケージは既にインストールされているところへ、 ドキュメントだけをインストールしたい場合、 cabal ではどのようにオプションなどを設定するのでしょうか
みなさんあいかわらずですねあ、かわいそう
あれ???
ああああああああああああああああああああああああああああああああああああああああああああああああああ
quickCheckの型は (Testable a)=> a -> IO()なんですけど、 instance Testable () instance Testable Result instance Testable Property instance Testable Bool なのに、Integer -> Bool の関数が quickCheckの引数にできる理由が分かりません
instance (Arbitrary a, Show a, Testable b) => Testable (a -> b)
本物のプログラマはHaskellを使うがやっと更新した
>>634 キター!
でも、非正格評価から正格評価に代えたらそれまで問題のなかったところで例外が発生するようになる、ということについてすごく注意を促しているけども、それってそんなに気にするようなこと?
いくらかでも役に立つ関数で、そういうことが起こることが想像しにくいんだが。
実用的なプログラムだと、!を多用する感じなのだろうか
そんなことはない!!!!!
>>637 単純にhaskellの記事が少ないからだが
記事というか、xmonadのソース(短い)を見るとそんな感じだったのでそう思った 先に引数評価するほうが速くなるのは多くのケースで真でしょ? 実用と一口にいっても速度を求められない場面があるのはわかってるが 速いに越したことはないし、末尾再起の展開だってされるし
>>640 xmonadのソースはリストを配列みたいにして使ってるし全然洗練されていない印象。
一見して何かを移植した感じだね。
Haskellって・・・w 僕よりプログラミングできないやつが何言ってんだか
何だかんだいって古いからなぁ ワークスペースと窓のスタックを選択するのにZipper使ってる所ぐらい?
効率が問題にならない場面なら「何でもリスト」でおk
xmonadのソース見てみたけど別に洗練されてない印象はないな リストを配列みたいに使ってるところってどこだろう
リストの便利さは異常 String が [Char] ってのはよくできてる
List的な操作はListLikeクラスとして提供して デフォルトでBytestringにしてもいいぐらい
xmonadは何より実行時に落とさないための配慮が凄まじい Haskellの型安全性を遺憾なく発揮している とliftM2を理解できない私は思うのでした。まる
>>648 liftM2 (++) ["a","b","c"] ["d","e","f"]
["ad","ae","af","bd","be","bf","cd","ce","cf"]
>>649-650 コードありがとう。これでliftM2はなんとかなりそう
xmonadの設定でこんな感じに使われてました。難しい
viewShift = doF . liftM2 (.) W.greedyView W.shift
なんか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則とかだけでやると・・・って話ね
ArrowAplly の話なら curry app == id は証明すべきものではなくてそうなっているものを ArrowApply にしていいよということじゃないのかな。 参考:「関数プログラミングの楽しみ」第10章 日本語訳版p.223
Arrow則で定められてるのはfirst (curry g) >>> app == gですね。 これを仮定して証明を頑張ってたんですが、結局できませんでした。 そもそもcurry app f == fとしても***も&&&もないんだからどうしようもない。 こんだけ頑張ってもできないんだから多分無理なんだろう、でも一度haskell-ircあたりで質問してみるか意やその前にircとMLの過去ログ検索するべきか。 curryはArrowAppの定義に含まれてなくてベタでラムダ式書いた形の文献が多かったです。 curry appがidになるのはArrow (->)における実装依存なのかなぁ そういやPrelude.curryもArrow (->)専用なんだよね
「関数プログラミングの楽しみ」第10章では ArrowApply の curry は curryA f b = mkPair b >>> f mkPair b = arr (\c -> (b,c)) となってます。
ついでに書くと app には満たすべき3つの条件があって arr ((>>>h) ☓ id) >>> app == app >>> h arr (mkPair ☓ id) >>> app = arr id mkPair f >>> app = f
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
と表示されましたが、何か関係あるでしょうか
誰も答えないので大変でしょうが頑張ってね。 僕もwindowsで触ってないしわからないのよ。 ここの多くの人って、脳みそがモナド、血液が関数でできていることを忘れずに。 7.0.4がでたので早速インストールしたhaskell platformも2月版で利用してみる。
どうしても出来なかったらVM入れて、linux上でやるとか・・・
>>659 windowsでhaskell使おうとするといろんなところで苦労するよ。
俺もwindowsでhaskell使ってたら問題がでて、
原因が分からず、解決するのに3日以上かかることが度々あった。
だから、もう今ではLinux上でしか使わないようになった。
>>659 cabalは結構不安定というか動作が謎いので、自分はあんまり使ってない。専らソース落して手動Setup.hs。linux上だとまた違うのかもしれないけど。
stub_cで止まるならばSetup.hsの前にconfigureを走らせる必要があるかもしれない。
あとはgccのincludeのpathとかかなあ。
pacman最強
不安定というかライブラリがcのコード含んでるときに、そのconfigure段階で死んだりすると 何が原因かよくわからんから、そういう時は.cabal/package以下にもぐるとそのソースのアーカイブを見つけられるから それを解答して手動でSetup.hsっていうフォールバックを行うってとこか そういう定型操作をある程度自動化するスクリプトとか書くといいかもな でも基本的にcabal使う Yiの必要パッケージを揃える為に手動で落としてとかやってられんもん まぁライブラリによっては自分でPACKAGENAME.cabalとかコードの一部を修正しないと入らないなのもあるんだけどね・・・
669 :
659 :2011/06/18(土) 13:55:24.72
みなさん、ありがとうございます あれからアドバイスを受けていろいろ試しましたが、 昨日まで全く進展無く、同じところで止まっていました で、今日 PC を立ち上げた直後に "cabal install glfw" したら、 なぜかインストールできてしまいました 理由は全く不明、俺には理解不能で、説明もうまくできません 昨日と今日で俺の周りの世界がガラッと変わってしまったかのようです なんか怖い でもまぁインストールできたのだから、とりあえず先に進みますが、 今後この世界が俺の記憶と違うようだと感じたら、 今日の未明に世界がおかしくなったのだと思うことにします
異常なほど眠かったので、寝て起きてみたら意味が変わっていたとかか。
Haske る? それともお風呂?
「それとも、マッ・カー・シー?」 そういいながらジョーンズ(仮名)は淫らにほほえんだ 長い夜はまだ幕を開けたばかりだ
インストールしたときのプラットフォームだけでなんとかなるようにしてほしい
フォローってなに 崇拝しろってこと?
Twitterの話じゃないのか
例えば3バイトの型を定義したい場合は Data.Wordの配列とするのは普通のやり方でしょうか? Byteみたいな基本型はないしCharはutf8が表現できるサイズみたいですし
Word8とかInt8とかあるよ。
ありがとうございます。Word8を使ってみようと思います それにしても、配列は選択肢が多すぎて辛い Array/IArray/MArray/IOArray/STArray/DiffArrayと、これらのUnboxed版 GHC拡張の並列版に、参考にしようと中身を少しだけ眺めれば ByteStringにはまた別のMarshall版の配列が使われている どうしてこうなった・・何を信じたらよいの
681 :
659 :2011/06/20(月) 19:50:06.12
Word単位で扱うならやっぱMarshalになるんじゃないのかな でも基本vectorでいいと思うけどな、どうしても性能が気になるのならMarshallでガンガンいく感じ それ以外の中途なものは最初は無視でいいと思う
Java のコンテナクラスみたいに共通インタフェースがあって 用途に応じて交換できるようになってれば理想だが… Haskell の改善点のひとつだよね。
一応functional lensesとか使ってで抽象化でできないこともないけど
687 :
デフォルトの名無しさん :2011/06/23(木) 01:47:49.49
今comprehending monads読んでんだけど Law(4)の証明の仕方がよくわからん [ft|q]のqのところの取り扱いがよくわからん
手続き型言語脳
>>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形式での構文定義も載せといて欲しいよなぁ・・・
>>685 う〜ん、もうちょっと勉強してから関数型言語のブログを書いて欲しいかな。
692 :
659 :2011/06/23(木) 12:47:47.73
Data.Functor.fmap 関数のシノニムとして <$> 演算子が Data.Functor や Control.Applicative で定義されているように Data.Monoid.mappend のシノニムとしての演算子はどこかに定義されていないでしょうか 標準ライブラリの中にという意味です
694 :
659 :2011/06/23(木) 19:25:02.82
>>693 参考になりました
ありがとうございます
RT osiire: Functional Programming Meetingは仮のタイトルでしたが、昨日「函数プログラミングの集い」に正式に決まりました。よろしくお願いします。
http://t.co/Uo0N61m #fpm2011
プログラミングから人への射影関数がどうたら
698 :
デフォルトの名無しさん :2011/06/24(金) 13:49:20.18
物質世界からアイデアを得て考え出されたオブジェクト指向言語と、 抽象的な数学世界からアイデアを得て考え出された関数型言語では そもそも思考の対象が違う。
オブジェクト指向はアホでもわかるように作られた 関数型はバグを減らしたり、高度な抽象化を目指して作られた
ガベコレっていつ行われるの? メモリ24GB積んでたとしても取り敢えずあればあるだけ使おうとするの? デブにおやつなの?
>>701 ヒープ領域(/=搭載メモリ総量)が尽きるたびに発生する
たくさんメモリを使うプログラムだと、ヒープ領域がだんだん大きくなる
まえになんかのプログラムを作って動かしたら、swap領域まで食いつぶされたことがあった。 笑 合計8G
数値計算のニュートン法をそのまま実装したらメモリフローしちゃったんですけど、どうにかならないでしょうか?
while(hantei(x)) { x = f(x); } C言語だと↑こんな感じ
foldl'使えばいいと思うよ
もしくはseq
スワップに及ぶくらいなら今すぐガベコレせよ って指令はできないの?
GCは不要なデータ、もっと正確に言えば参照されなくなったメモリ領域は再利用するが 不要な参照が残るようなコードを書かれたらヒープを拡張するか投げ出すしかなくなる
bukkake(x)
ハスプラにvector標準搭載しといてくれよ
716 :
デフォルトの名無しさん :2011/06/25(土) 14:51:03.33
vectorとrepaでblasとlapackってないのかな? FFI使ってるのならあるけど vectorとrepaには期待している
>>698 だから、関数型言語を挫折したまま語るなよ
両方一応でも覚えたって実感したら、むしろ関数型言語の方が簡単に覚えられるって気付くから
プログラミングhaskellの半分以上は対話プログラムとか、切符番号遊びとか、具体的なプログラム作りだぞ
基本文法覚えるだけなら、あの薄さのさらに半分で済む
手続き型言語の入門書の厚さの割に基本文法覚えるだけの内容のなんと多い事か。。。
Hentai 言語 Haskell
プログラミングに一度も触れたことのないような何も知らない人に勉強させるときに 手続き型と関数型のどっちが良いのだろうかと考えることはある
考えるまもなく手続き型のC言語に決まってるだろうが。 ノイマン型コンピュータ使ってんだろうが。
>>719 文法覚えるだけなら関数型の方がすぐ覚えられそう。
だけど、文法覚えてから何か作るなら手続き型の方がすんなり作れると思う。
機械語がわかってて、これからプログラミング言語習います、なんて人は普通ごくわずかだと思うがね。
>>719 自分は関数型言語だと思う
特にswap関数は手続き型ではtemp変数が必要なのか、初心者は理解が難しい
(スコープによっては(=大抵は)アドレスも意識する必要出てくるし)
この辺は、関数型言語の方がそのまま位置を交換出来る
(変数の値ではなく、数列などの順番である事に注意)
>>721 それは単にライブラリの充実度の差で、手続き型か、関数型かの差では無いと思う
>>723 数列の非常に離れた要素同士の置換も、関数型言語の方が分かりやすいのか?
明日情報セキュ試験受けるんだけど、 参考書読んでたら試験内容が洗脳臭くてワラタ
>>726 もしよければ例示してみてくれないだうか
どうも「特にswap関数は手続き型ではtemp変数が必要なのか、初心者は理解が難しい」
というのがイメージしにくい
必要に決まっているという思いが私の中にあるから、
これよりもっと分かりやすい関数型による離れた要素どうしの置換があるというのは
にわかには信じられない
>>728 リストの最初と最後を交換する関数
FirstLast (n:ns) = (last ns) ++ (tail ns) ++ [n]
3つ組の数列(タプルにするけど、固定長なら基本的にリストでも同じ)の先頭と最後を交換する関数
triple (x,y,z) = (z,y,x)
何番目と何番目を交換するとかは、どういうパターン(ここでは性質の事とする)で交換するのかを考えて記述していく
リストの最初と最後を交換する関数 FirstLast (n:ns) = (last ns) ++ (tail ns) ++ [n] これ本当に手続き型に比べて初心者がより理解しやすいものなってるのかな 例えばC言語なら次のように書ける tmp = xs[0] xs[0] = xs[最後] xs[最後] = tmp 理解しやすさの度合いは、どちらも大して違いはないように思える それどころか、これなら何番目と何番目を交換するという場合も 同じ考え方でいける
>>730 初心者はまず
xs[0]=xs[最後]ってやっちゃう(経験談)
理解力あれば、すぐにtempを使う理由分かるけど、分からん人はトコトン分からん
あと、Cだと確か
xs[最後] = xs[(sizeof(xs)/sizeof(xsの型))]
だったと思う
(文字列ならstrlenで済むけど)
本当にトリビアルですがtailではなくinitでは?
>>731 > 初心者はまず xs[0]=xs[最後]ってやっちゃう
やっちゃうことの問題点が分からない
初心者はやっちゃっていいでしょ
それでは望む結果が得られない「理由」を教え解決へ導くのは教える側の役割だよ
それとも、教える側も、「理由」を理解させることが容易ではないという事?
ちなみに、last ns はリストではないから、そのままでは ++ で繋げられないのだが、
それを理解させるよりも難しいという事?
>>728-733 リストと配列という特性が全然違うデータ構造でのswapを比較して言語の優劣を議論してる時点で全員論外というか何も理解してないのが丸分かり。
リストは伸縮は自在だが要素のアクセスに関してリスト長Lに比例するO(L)時間が必要、配列は伸縮は困難だが要素アクセスはO(1)時間。
こんなに違うものについての「要素の交換」を同じ土俵の上だと思って比較して関数型と手続き型の優劣を議論するのは何もわかってない証拠。
手続き型の配列に相当するものは関数型言語では定義域が有限区間の写像であってリストじゃない。
逆に関数型でのリストに相当する手続き型でのデータ構造は構造体とポインタで作る普通の一方向リストだ。
手続き型プログラミング言語で一方向リストの先頭要素と最終要素をやるには、Haskellでのlastやinitや++に相当する関数を
先ず自分で再帰的に定義すれば交換そのものは729のHaskellでのとほぼ同じ書き方になる。
(C言語だとinfix operatorは自分で定義できないからHaskellでの++はCでは普通の関数呼び出しになり見た目は綺麗じゃないが本質的な問題じゃない)
そういやC++標準ライブラリに一方向リストって無いな なんでだろ
初心者にCだけはありえんなあ プログラミングの本質から外れた罠が多すぎる あの言語じゃアルゴリズム覚える前に意味不明な(多くは意識せず使われているポインタ絡みの)エラーに悩まされることになる まだJavaのがマシかと
同感だな 10〜15年前とは状況が違う
高級アセンブラと言われるし、プログラミングの本質よかも計算機の本質じゃね? アルゴリズム+データ構造を本質とするなら、 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;}
リスト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 効率を無視すればこれが素直か。
こんなんでどうか swap xs i j = map f (zip [0..] xs) where f (idx,e) | idx == i = xs !! j | idx == j = xs !! i | otherwise = e
>>734 配列が伸縮困難というのは嘘
はじめから要素数を必要以上に確保しておいて、ただ単に最大要素の添え字Nを変えればいいだけの話
Cを覚えろってのは計算機が具体的に何をしているのか理解しろってこととほぼ同義だし、 コンピュータを勉強するなら基礎教養としてある程度はCを齧っとけっていうのは正しい。 Cを使っててこりゃ面倒だ、と感じたものが他の高級言語でどう解決されるのかを知るのは良いことだ。 ただ、Cだとアルゴリズムに特化できない諸々の事情があるし、 lispみたいに簡単にそういう面倒事をラッピングできる機能もない。 再帰アルゴリズムとかCでやるにはちょいと苦痛。 置換モデルがつかえる言語じゃないと、少なくとも俺は再帰が理解できなかった。 個人的にはHaskellも、ちょっと面倒。純粋関数言語はどうも潔癖すぎる気がしてしょうがない。 今まで実行時エラーにでくわしたことがないのはちょっとした脅威だけど。
>>734 全くその通りで、言ってること自体には何の反論もないが
なんか論点が違うような気がする
>>723 も
>>725 (私)も、
>>719 の通り
「プログラミングに一度も触れたことのないような何も知らない人に勉強させる」
ことを前提で考えている
で、
>>723 が提示したのは「数列などの順番は関数型の方が教えやすい」というものだ
「何も知らない人に」数列などの順番の入れ替える概念や実際のプログラムを教えるのに、
どちらが教えやすい&理解させやすいんだろうねという議論
だから、リストを使おうが配列を使おうが他のものを使おうが、
そんなことはどうでもいいし、伸縮とかアクセス時間(効率)とかはもっとどうでもいい
私たちが議論していた論点は、これからプログラムを組んでいく上で頻繁に出くわすであろう
要素の入れ替えという概念と実際のプログラムの、教えやすさと理解しやすさだよ
それが理解できなければ効率もなにもない
Haskell は低水準部分を無視してアルゴリズムに没頭できるって言うけどさ、 x := f(x) みたいな簡単なイデオムすらを頭をひねりまくってHaskellに適応させることをアルゴリズムに没頭すると言ってるのなら、 根本的に何か違うと思う ハードウェアという困難を無視してアルゴリズムに特化してるのではなく、 ハードウェアという困難を無視できる替わりに(アルゴリズムそのものとは別の)新しいHaskellという困難に特化しているんだと思う そのHaskellという困難はハードウェアという困難よりも学習は困難だと思う
つーか、Haskellには代入がないから、入れ替えなんてできない
>>745 そりゃお前が x に f(x) の値を「代入する」という意味や操作を
C言語などの手続き型言語でどうやるか既に理解しているからだろ
お前はきっと手続き型をかなり身につけていて、
その経験を元に関数型を見ているから学習は困難だろうと感じるんだよ
全く何もプログラムについて知らない奴に教えるんだから、
そもそも「代入」という概念を教えず代わりに「等値」という概念を教えることで
Haskell プログラムを理解させるのはそれほど難しくないと思うぞ
それほど難しくないと思うぞ
>>747 関数型と手続き型は別の概念じゃないでしょう…
代入は関数型の中心的概念で、むしろ、代入しかないのが関数型
Haskellには「再」代入がないだけ
>>749 申し訳ない
>>745 > x := f(x) みたいな簡単なイデオムすら
と言うのが、いわゆる再代入の意味で言っていると完全に思い込んでました
今後は微妙な意味の言葉には気をつけて発言します
>>749 むしろ代入って言葉は再代入前提で使うことがおおくないか?
中心的概念っていうなら「束縛」のほうだろう
>>750 俺もその「イデオム」は再代入前提の例だと思うんだが
再代入は難しい概念じゃなくて、数値計算アルゴリズムや「計算」で勝手に出てくる概念 再代入の避け方を教える方が難しい
こういうレベル高い議論しているとこ無知を晒すんだが、 STモナド(STRef型)って概念として再代入に含まれるんだろうか。
うん
>>734 まあ、ぶっちゃけhaskellでもCでも、リストと配列両方使えるけど、初心者はその言語で基本的なデータ構造使うので、初心者でなければ配列とリストで適した方を使えば良い
ただ、初心者が扱うならせいぜい5個とか10個程度の要素数だろうから、その並べ替え程度なら、要素に名前付けて、入れ替えるだけって言うのも出来る
(
>>729 の3つ組の例)
あと、初心者はよく
a=a+1
ってどう言う事?とか聞いて来る
代入、(数学ではなく、言語の)変数の概念を理解する必要がある
手続き型支持 1.情報量多い 2.関数型は初心者にとって行間が多い メモ帳の使い方ぐらいのレベルから解説してる本やサイトなんてないじゃん
そういうことはこれからだな。儲けの種が転がってるともいえる。
>>756 独学なら、情報量の多い手続き型だな
でも、情報量が同じor指導者が居るなら関数型だと思う
そもそも関数型の反対って手続き型なの? Pascalから入ったから、C言語をはじめて見たとき、これ関数型じゃん、と思ったが
反対とかじゃなくて並列。論理型とか pascalはローカル関数が使えるんだからCより関数型に近いと思うけど
プロシージャが「関数」だったら関数型、とかいう変な誤解だろ
>>759 関数の意味がまるっきり違う
関数型では、ある意味変数や演算子も関数
(と言うか、逆だな。関数の方が変数と考える)
happyってどうなの?
C言語は関数を変数に代入してるけど コールバックとか ポインタ参照とかは定数も関数も変数自身もまるで区別してないし
関数へのポインタであって関数ではない
>>764 それは関数型と言うより、コンピュータの本質かと
データと命令区別してないのはコンピュータの性質
関数ポインタまで使えれば、それに迫れるべ
チューリング等価なのだから、本質的には同じなのは当然
表面的にはどっちよりか?と言う話でしか無いよ
んで、関数型言語と言われる言語と同じ事が簡単に出来るのか?
map関数はCじゃどう作る?
Cでmapを書くのは簡単だよ 高階関数自体は書けるけど、レキシカルスコープの局所関数が書けない
A B⊆A C⊆A B∧C = 0 なんてどんどん登録していけば集合の分割をしてくれるライブラリありませんか?
>>768 純粋な興味でC de map関数は見てみたい
良かったら書いて見てくれへんか
今のコンピュータがレジスタへの代入やメモリの書きかえで動いてる事を考えると、 直感的にコンピュータの動作と一致してるのは手続型だろう。
逆に抽象度が高い方が理解しやすい人間も世の中には少なからずいるから一概には言えん
「計算」か「計算機」のどちらを理解しようとしているかによる。
ここまで無知さらした議論もある意味清々しい
こういうこと言うやつが知恵を感じさせる発言をした試しがない
関数型プロセッサ創れよ
プロセッサというのはプロセスをする装置 プロセスすなわち操作 それは手続き型特有の概念であって、関数型に操作というもは無い よって、そもそも関数型プロセッサという言葉が矛盾をはらんでいる
>>776 作っても、lispプロセッサーみたく消滅するから無意味
それよりCのmap関数はまだですかね。。。
簡単だと言うので、見られると思ってたんですが
実用性皆無
>>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]);
}
C++のstd::transform()のノリか
>>781 ありがとう
Cを見たとき関数型言語だと思ったって人の話とは全然違う印象だし、簡単と言っても、初心者にはとても簡単には真似出来なさそうだけど。。。
個人的に、ポインタは入門書にも必ず出てくるけど、初心者向けの概念か疑問なんだよね
特に関数ポインタは入門書に載ってない事多いし
そういう意味で(実用性はともかく)、学習用には関数型言語は向いてると思うんだが。。。
C改良の関数型言語が欲しい ゲームや組み込みでヒットすると思う
あのね。 関数ポインタと、関数という値(たとえば Integer -> Integer という型の値)があることとは、 意味が全然違うから。
お前が違うと思ってるだけ。 必要な機能は自分で書くのがC言語。
言われてみれば、手続き型にカリー化が無いのは意外と痛いかも
え?
>>786 それは関数型言語も同じ
最小限の知識でかなりの関数を自作出来る
(ポインタとか覚えなくても、結構高度な事が出来る)
学習用として、個人的にこの点を評価してる
>>789 同じか同じじゃないかは判断基準による。
Cはノイマン型コンピュータの抽象化言語だから存在意義がある。
この視点は一定以上の需要がある。
学習用という視点なら一考の余地はある。
>>790 そうなんだけど、最初に得る知識量と作れる関数のバランスは、Cだけじゃなく、rubyやpythonよりも良いと思ってる
総合的には手続き型の方が簡単に出来る事多いけど、初心者の知識で出来る事が少な過ぎると感じてる
初心者に関数型とかメリットないだろ。 ブラウザ+Javascriptくらいが妥当。
>>792 初心者にこそメリットある
特に最近の手続き型言語は暗記もののイメージが強い
(Cはそうでも無いけど、今度はコンピュータの知識が必要になる)
関数型言語は、最小限の知識で自作出来るのが、初心者の力の底上げになる
haskellの処理系を自作とか流石に無いわ 未踏でも応募するつもりか
Prologから見たら、Haskellは手続き型言語そのものだと思うが
>>797 いや、文法覚えるのは暗記だから、それ程重要じゃ無い
プログラミングのコツみたいなのを覚える方が重要
それに関数型言語は向いてると思うんだよ
お前らがHaskellで実用ソフトバンバン世に出さないから嘗められるんだろが
実用ソフトを生産してるプログラミング言語No1はアセンブラ No2はC言語 物凄く大きく差を開いてNo3にJava CやJavaですらコードを見るとソースの中にアセンブラが埋め込んである体たらく
>>801 Cってマシンに依存しないアセンブラで
インラインアセンブラの部分は
Cが生成できないニーモニックを書くところじゃん
手続き型,関数型∈S, S上の二項関係R 文系,理系∈T,T上の二項関係R' 代数{S,R}から代数{T,R'}へのhomomorphismまたはそのinverseについて
>>802 それだけじゃなくて、レガシーソフト(アセンブラ)との互換性のためにアセンブラを埋め込む
他にも、コンパイラが効率のよいコードを生成できないときにもアセンブラを埋め込む
実用ソフトの世界では、まだ40年前のコードが現役で動いてる
そのうち誰もメンテナンスできなくなって社会インフラが止まる
社会のことを考えたら、Haskellなんかやらせずに、アセンブラプログラマを量産しなくちゃいけないのに…
そういうのは延命する度に後々面倒になるから早めに火吹いてリプレースする機会ないと
40年前っていうとCは存在しないな
>>798 Haskell の何を見て Haskell が「手続き型」だと言っているのだ?
そもそも、
>>798 の言う「手続き」とは何だ?
そういや、なにげなく「関数型」というが、定義ははっきりしてないね。
何を持って関数型というのか。 現実的には狂信者の比率で判定する。
>>808 個人的には、右辺と左辺がほとんどの場合等価になる様に設計された言語。と定義してる
(ので、脳内では等価型言語と読み替えようか迷ってる)
いわゆる論理型言語みたいなものか
論理型言語の = は右辺と左辺が完全に等価。
>>813 そもそも、論理型言語で=をほとんど見ない件
論理型言語は関数の引数と値が同身分 X=f(Y) と宣言すると、XからYを生成できるし、YからもXを生成する (Prologだと XとYのペアが出力になる)
>>807 手続き=入力(引数)から出力までの一方向の処理手順
y = x + 1
のとき、Haskell は xに1を加えてyに代入するという「手続き」を表現する
(ちなみに、y == x + 1 のときは y と x+1 が等しければ True を出力せよという「手続き」を表現している)
Y :- X + 1
prologでは、yがx+1と等しいという「関係」を表現する
関係なので方向はない
プログラマは関係だけを表現して、YやXを出力する手続きは処理系の仕事でプログラマは単純には関与できない
>>816 pascal勉強した事無いの?
手続きは、必ずしも値を返す必要無いんだよ?
(Cでいう返り値がvoidの関数)
簡約
でも実際はcut使いまくりで無理やり関与するのが極普通のprologプログラマ
>>817 値を返す必要はないけど、出力はある
チューリングマシーンでいうところの終了状態判定出力
PrologにもPaskalの手続きにも出力はある
簡約を手続きと表現するなら出力というのはあれだ、簡約の停止が相当するんじゃないか となると停止しない式というのもあるから出力が無い式というのも当然あるな でもそれはvoidとはちと違う(始対象と型付ラムダ計算の簡約系における圏みたいなの使って無理やり対応させることはできるけど)
手続き型 ⇔ 宣言型 関数型 ⇔ 実引数なしの関数は1階未満の関数のみ代入対象になってる型 関数型の対立概念は手続き型ではない
>>806 鉄道会社で生きてるプログラムのワニ脳みたいな部分はほとんどがアセンブラ言語
当時の天才連中が高級言語を使わずにニーモニック表だけでバカデカいシステムをバグなく組み立てちゃった
高級言語で組み直す気すら起きないほど品質が良かったためそのまま生存競争に勝ってきた
2000年問題のときに外科手術が必要になって切り開いたけど、そのときはアセンブリ職人がいたからなんとかなった
今はそのアセンブリ職人も退職した
もう怖くて誰も手を出せない
自分でプログラムの才能があると思う人はHaskell捨ててアセンブラやりましょう
楽しみ捨てて苦行やりましょう、といわれても
>>823 禿げる
禿げないようにする為高級言語が生まれたのだ
宣言型←→命令型だろ
>>823 小学生の時にハンドアセンブルしてZ80のプログラム書いてた。
Z80とかPICみたいな玩具触ったぐらいでは手も足も出ないのがレガシーシステム
>>816 なるほど、面白いな、そういう考え方もあるのか
俺は違って、プログラマに手続きの手順(プロセス)が見えていなければ
手続き型とは言わないと思う
逆に言えば、計算の手順を記述するのが手続き型だと思う
だから、y = x + 1 のようなプリミティブな式では、
たとえそれが C 言語で書かれていようと、「それだけ」では手続き型とは判断できん
もう少し大きなプログラムでなければ分からない
Haskell の本質はプログラムは計算の手順を記述(指示)するものだとは言えない
手順は処理系が生むものだからだ
C 言語は明らかに計算の手順を記述するため、迷わず手続き型と言える
(式を順に評価し、その式が評価された時の環境の状態を記述しているとも言える)
ただ、言語によって区分は曖昧なところも幾分あるから、最近は
プログラムの意味を表示的意味論で表すのが自然と感じるのが関数型で、
操作的意味論で表のが自然と感じるのが手続き型ではないかと考えている
ちなみに、Haskellで y=x+1 と記述した場合、これは同値を表す
同じスコープでyと書かれているところをx+1と書き換えても、
x+1と書かれているところをyと書き換えても、
また同じスコープのどこで定義しても、意味は同じだ
>>828 俺が学生の時、所属大学の物理学科が使ってるある古い装置のプログラムを
アセンブラで組んだ事があったな。
お前詳しいだろ、ちょっとこい、と言われて助手の給料で働かされた。
骨董品がそんな簡単なものばかりなら
>>823 みたいな状況にはならない
大学で使われてるのは比較的簡素なものだろう
>>831 おい、俺をバカにすんのか?
スーパーハカーだぞ
なんだ自慢したいだけか つまらない
物理で使う装置って言ってもピンきりだからな。 加速器とかのプログラムは難しそう。よくわかんない。
手続き型は手順を書くのが主で
関数という概念はあるが、その関数も多くの場合は手順として書かれる
関数型は「式」を書くのが主で、関数は「式」として書かれ
より純粋なものになると、手続きすら式となる
てな感じだと思う
>>819 無理矢理っつーか、処理系が作り出すフローを
流れを変えて制御してやるのがPrologのプログラミングだろ
関数型プログラミングの大元はたしか関数定義の集まりがプログラムになる ようなもののことを指していて、別に言語がどうこうとかあんまり関係なかったはず。 アセンブラやFortranに比べた場合、FPやLispは関数だらけだったから、 これは関数型プログラミングだ、というのは、意味があったんだろうけど今はあんまり関係ないだろ。 さらに言えば、副作用がどうこうとか完璧後付けだし、関数定義でプログラムが構成されていれば 関数型言語でいいんじゃね。
完全に120%本末転倒。 関数定義の集まりがプログラムになる、なんてのが、90年頃から広まった C言語は関数型言語とかいう意味不明なデマから逆に推測された変な定義だから。 値を取って値を返す、数学的な「関数」(すなわち副作用がない)だけで プログラムを作ろう、というのが、FPとかが提唱したことで、そちらこそが 本家本元の「関数型」。で、歴史的に見るとLispがそういうのの初めだったと。
ん?ラムダ計算がベース理論になってるのが関数型言語じゃないの?
いや、年代的にも間違いなく90年代以前からだ。 FPはプログラム代数というのを理論として持っているけど、λ計算とは違う。 Lispもλ計算を実現するために設計されたみたいな話が蔓延しているけど、 それもたしか後付けだったはず。
関数型かどうかというのは言語の性質ではなくて プログラミングのスタイルじゃないか、という気が最近はしている。 MLやLISPを使っていると特に。
MLは意図的に手続き型ないし命令型のような要素を含んでる。 Lispは最初から関数型じゃないスタイルも持ってる。
別に可読性を保ちつつ動けば何でもいいだろ。
C++で関数型
コンビネータが出てくると関数型って感じする つBoost.Spirit
>>838 C言語もラムダ計算で表現できる
シャバにあるC言語のプログラムを数学的にきちんとした仕様で表現しようとする研究でラムダ計算が大活躍してた
個人的には、関数が第1級オブジェクトであると同時に、その場で(コードのある地点で)関数を定義できるものを 広い意味で関数型言語とみなしている。Cは別の場所で関数定義しなきゃいけないから関数型じゃない。 C++のラムダは変態だけど関数型とみなしてる。 あとはコーディングスタイルが、どれだけその場関数定義を多用するかで関数型の度合いを見ている。 だからCLよりもSchemeの方が関数型だと感じる。
>>829 Prologを作った人(Kowalski)が言うには
アルゴリズム = 論理 + 制御
アルゴリズムを書くと言うことは制御(手順や手続き)を書くことになるそうだ
つまり論理型から見ると関数型はより手続きということらしい
現実のPrologは関数型よりよっぽど手続き的だけどな
個人的には紙と鉛筆で実行させて(簡約して)結果を得られるのが関数型言語 異論は認める
どうでもいい定義ばっかだな
haddockってソースに#includeがあるだけで止まるの? その行で: lexical error at character 'i' でストップするんだけど
私がチラ裏を2chに書く理由: ブログだと継続的に高品質な文章を書かないとほとんど見てもらえないから。 2chなら気が向いた時だけ書きこめば多くの人に見てもらえるから。
おれはブログに載せる前のアイディアの推敲かな
ブログとかキモ
ブログとかきも 同意 見て貰う為とか、どこのすいーつ(笑)だよ 技術日誌とか、自分にとって一番見やすすく記憶しやすいようにメモしていきゃいいんだよ ノートを教師に見せる為にかいてるような、そういうタイプだと中級者より上には絶対いけやしない
Haskell なら中級者までいければ十分だよな
>>855 違うね。
ブログで重要なのは:
1.売名
2.自分の思想を普及させてしまえば自分が第一人者になれる→儲かる
3.アフィリ
4.仲間を見つけるため
858 :
デフォルトの名無しさん :2011/06/29(水) 14:17:24.78
winhugsはファイルをドラッグアンドドロップして関数ロードできるから便利に使ってたんだけど テキストファイルに書いた関数もロードできたのでびっくりした。 拡張子変えなくていいので楽。
関数をとってその関数を別の文脈で使用する関数に変換することを その文脈に持ち上げるといいますが 定数をとって別の文脈で使用する関数に変換することもそういいますか? Real World Haskell 231P constPのことです
>>859 そういっても何も差し支えないと思うんだけど。 定数ってのは引数なしで値を返す関数のことなんだし。
>>860 どの引数を受け取っても同じ値を返す関数が定数(0階関数)
862 :
860 :2011/06/30(木) 20:18:21.69
>>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
861ではないが0階関数(ていうか0項演算っていわない?)って書いてるじゃん。
>>864 は1項演算扱いしている。
>>865 どの引数を受け取っても同じ値を返す関数が定数(0階関数)
> どの引数を受け取っても同じ値を返す関数 こうですか \x -> 1
>>860 の意味での定数は計算機科学の話でよく出てくる
関数の引数の数を項数(アリティ)と言い、項数0の関数を定数とする、
というような感じで
>>861 の意味での定数は、俺はプログラミングの文脈では聞いたことないな
たしかに f x y = 3 は定数として働くよなという気はするが・・・
これはどういう文脈での定義なの?
数学とか?
「どの引数をとっても同じ値を返すのが定数」という解釈は数学(微分)で出てくる f(x)の微分をf'(x)と書く f が多項式のとき、f''''''''(x)のように「''''」をくっつけていくと、これはいつか定数になる f''''''''(x)はxに何を入れても同じ値を返す関数であり、同時に定数 「○階関数」という呼び名は論理学で出てくる 2階関数 f(f(x), y) 1階関数 f(x, y) 0階関数 c
0階はすべて個物対象で、集合(関数)はないだろ。
定数 ⊂ 関数
説明がないと、何を意図しているのか誰にもわからないよ。 質問にも答えていないし。
>>871 引数なしだが定数ではない関数がある(例 乱数関数、メモリ関数、main)
引数がある関数なのに定数である関数がある(例 f x = 0、メモリ関数、=、main)
正直、HaskellはPrologと同じ運命をたどると思う
>>874 >>861 の定義も文脈によっては存在するとしてだ
引数無しの関数を定数と定義するのも文脈によってはあることは知ってるよな
つまり、どちらも正しくて文脈によって変わる
>>859 の質問と
>>860 の返答で使われている「定数」という言葉は
どちら文脈で解釈するのがより適切なんだ?
俺は計算機科学の文脈で普通に使われる定義で考えるべきだと思うが
ちなみに、Control.Applicative.pure 関数は a -> f a という型で
"Lift a value." という説明があるから、このような場合も
持ち上げと言って差し支えない
Haskellの知識なしにモナディウスのコードを眺めてたのですが IORef,keyboardMouseCallback,addTimerCallbackなどみてると 手続き型と変わらないように見えました。 みなさんはどのあたりにHaskellで書くメリットを感じているのでしょうか。
>>877 グラフィックとかGUIが絡むと手続き臭が漂って臭くなるのは
仕方がないことかも。ホント臭いよな。
>>877 その辺り FRP を使うとコードがスッキリする(可能性が高い)
もう少し言うと、かなりの量の臭い部分をライブラリ内に閉じ込められる
自分でライブラリを作るのなら、臭い部分を綺麗に分けられるとも言える
(その可能性が高い)
今ちょうどテトリスの製作を目指して FRP ライブラリを作っているところ
そのうち公開する
Monadius.hsあたりが本気でヤバイ もうVBで作ったゲームみたいなコードになってる この辺はexistential typeとか使えば普通のOOPL程度にはすっきりしそう あとは直で埋め込んであるデータを(de)?serializeを用いたDIっぽいやり方でコードの外に追い出してやるとか?
また口だけ大王ばっかに
FRPライブラリってもう一杯出てるやん reactive, yampa, elerea, grapefruit, banana, buster...
じゃあおいちゃんはbanana一本もらおうかな
FRPってよく分からないんですが、 C言語でやるとしたら、変数のアドレスを代入することで実現するモノなんでしょうか?
>>886 入力側に変数しか定義できなくて良いなら変数ポインタで実現できますが、
式を定義できるようにするには式へのポインタの代わりになる物が必要です。
C言語にはオブジェクトもクロージャもないので関数ポインタが定番でしょう。
>>886 FRP はファンクショナルなリアクティブ プログラミングだ
C言語でやるならファンクショナルである必要はないし、
無理にファンクショナルにすると返って変なことになる
普通にリアクティブなシステムをプログラムすればいい
で、リアクティブなシステムというのは、
外部の入力や変化(マウスボタンとか、メニューの選択とか、別の計算結果とか)
に反応して結果を返すというシステムだ
意味論は書籍「コンピュータ サイエンス入門 論理とプログラム意味論」が詳しい
たとえば、Windows の GUI がリアクティブなシステムの代表例だ
それを実現するために Windows では外部の入力や変化を
メッセージという形でブロードキャストする
それをウィンドウプロシージャで受け取るというのが、
リアクティブなシステムをプログラムするひとつの例だよ
C言語で実現させる具体例は
>>887 が一例挙げている
そんなリアクティブなシステムを
関数型らしく宣言的にプログラムする仕組みが FRP だ
しかし論文書いて終わりのライブラリばっかりw
面白いとは思うけど実用的じゃない
>>890 その FRP を使って何か具体的なものを作ったという話が、
残念ながらサンプル以外になかなか見ないからな
だからテトリスを作ろうと思う
テトリス作れば実用的なの?
今ならFRPで簡単なRTS作るだけでも学士論文ぐらいにはなりそうだなw
>>892 FRPを使ってゲームとしてちゃんと遊べるテトリスを完成さることができれば
そのFRPライブラリは実用に一歩近づくと俺は思ってる
なんでテトリスかというと、ゲームシーンの遷移や、ロジック、
グラフィック処理などゲームに必要な基礎要素がコンパクトにまとまってて、
FRP の恩恵がどれくらいのものか検証しやすいから
それでいて、古典ゲームなのに今プレイしても楽しいし
ニューラルネットみたいに、数字が伝搬してるヤツに向いてるってこと?
ゲームって結局、 「状態機械に、入力デバイスをリアルタイムで反映させた差分式で更新して 外部デバイスに出力する、を繰り返す。」というモデルだと思うんだけど これを関数型にできる、もしくはしてメリットがあるものなのかな。
>>896 「関数型にできる事」にメリットがあるかは作って検証してみないことには分からんな
まぁ今のところ俺の予想だと、んなの C# で作った方が楽に決まってる
つまり関数型にできる事にたいしてメリットは無いと思う
俺は単純に Haskell で今までよりもゲームが作りやすくなるって事に、
むちゃくちゃ大きなメリットがあると思う
(実際に作りやすくなったかも検証次第だが、作りやすくなると信じて取り組んでる)
たとえミニゲームでも思ってたよりサクサク作れたら
Haskell って楽しいなって思ってくれる人がきっと増える
おれはゲームが作りやすくなるには否定的な感触だけど ぜひ結果が出せたら教えてくれ。
ぜひ結果が出たら論文を書いてくれ!
>>899 嫌だよ
論文なんてひとつも書いたことないから、
書き方勉強するだけで余計に時間取られる
ただでさえ仕事で疲れるのに
ホームページ作って、夏休みの自由研究の感じでアップする
という公開方法なら気楽でいい(夏中に終わるわけ無いが)
ただ、そんなことは皮算用なんで、今はとにかく研究・実験に集中する
>>894 今ならテトリスより倉庫番とかQIXの方が有り難がられる
ん?QIXて流行ってんの? 倉庫番はイベントドリブンでもかけるからちょっと意味合い違っちゃう。
いやテトリスが食傷だっただけだけど ソースコードがここの書き込み1回で済ませられる程コンパクトな ジャバスクリプト版も出回ってるくらいだし ファッションセンス
自由研究という文字列だけを見て 小学生が夏休みの自由研究でHaskellを使ったFRPでゲームみたいに空目し 凄い小学生もいるもんだと勝手に感動してしまった
>>901 いいじゃん、俺はテトリスが好きなんだよ
クイックスなんて地味だし、動いてる敵のAIがめんどい
領地計算が何となく見難しそうだし
倉庫番の解説なんかとっくの昔にセガの人に先越されてて、今さら感ありあり
キャラ一人だけでリアルタイム性も無いし、動いてる間はキー入力受け付けないから、
Behavior の有難味がいまひとつだし
そうか。お前が言うならそうなのだろう
ブロック崩しとかはもうあるから(ex. elerea-examples)テトリスあたりが適当なんだろうな シューティングまでいくと流石に飛躍しすぎて挫折しそうだし
Haskellってクロージャかけるの?
Prelude> let kurouja = "kurouja" Prelude> kurouja "kurouja" Prelude>
>>908 むしろクロージャは関数型言語が元祖だが。。。
クロージャは高階関数という名前でクロージャと意識しなくても簡単には使える
多分そういう意味ではないと思う
「状態を閉じ込めたもの」を書けるか、ということなら、 型に制限がある、という答えになるのかなぁ
なんか集合論で使われる関係とか位相でいう閉じているとか開いてる っていう概念を使って閉方っていうのを定義するというのを聞いた事がある 関数型言語で使われるクローじゃもそれ由来なのかな? ちなみにポイントフリーのポイントってのは位相由来というのも話だけは聞いたことあるけどどういうもんかはよくわからん 位相は挫折したからな
集合・位相・距離
プログラミング言語で言うクロージャは、動的スコープに対して、静的スコープによって 名前の参照が関数を定義するスコープに閉じてる、ということ。 数学とはあまり関係ない。
わかりにくい。ローカル環境をもつ関数オブジェクトでいいだろ。
なんだよローカル環境ってw 自分定義の用語使って分かり易い説明ですか?www
任意の開集合の逆像が常に開集合だと連続だよね(キリッ
Prelude> let x = 10; foo y = x + y Prelude> foo 10 20 Prelude>
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系を無視してる?呆れる
変数束縛だったらこっちのほうが良かったか。 Prelude> let a = (+ 3) Prelude> a 4 7 Prelude> (+3) 4 7 Prelude>
>>917 大域環境ではない局所的な環境のことだよ。Lispだと関数定義の中だけで
既に定義されている変数の上書きできるだろ、その変数の情報を収めている
環境のことだよ。
なんでも過去のLispは環境の実装がいまみたいにきっちりしてなかったみたいで、
関数呼び出しをする場所によって、自由変数の指す値が変わってしまったそうだ。
そんな摩訶不思議なことを避けるために、関数定義の中で閉じた変数束縛の手法
のことをクロージャーと呼ぶようになったらしい。
http://www.amazon.co.jp/dp/400007685X
数学セミナー7月号から、圏論の歩き方って連載が開始されてる 初回の記事は対談形式で、圏とは何ぞや?なぜ圏なのか?(なぜ圏を使うのか?)とかが、書いてた 少しは圏について得るものがあるかちょっと楽しみ
プログラミングに関係するとしたら自然性と普遍性だろうけれど、 どのようにプログラミングに適用すれば良いのか?という実践的ノウハウが みあたらないし、仮にそれがあったとしても、高い導入コストに見合う リターンがあるのか不明。 多分直接的になにか役に立つという方向はあんまり期待できないと思う。 そういう系じゃなくて、なんでそんなわけわからないものに関心が向いてしまうのか とか、琴線に触れてくるものは一体なんなのか?という原因を見付け出したほうが 一般的に使える結果が得られると思う。圏論の言葉を使う必然性も全くないし。 そもそも、全くよくわからないし利害性もないのに関心が向くなんてどう考えてもおかしいだろ。
数学セミナーとか購読してるような奴らが Haskellの当たり前なユーザなのか こりゃ他言語と毛色が違うな
>>925 今回の記事によると「(思ったよりも)ローコスト、(経験的に)ハイリターン」だそうな
連載の記事を書く人は、それぞれの分野で道具として圏論を使ってる人がリレーしながら書く予定だとかで、今回の記事(対談)でも、「唯一の正しい抽象化のレベル」とは限らないと書いてる
記事から感じるのは現実問題として、コスパが良かったから選んでるって言う印象
圏論勉強会とか参加してる連中がこの言語ユーザーの主流派だしなぁ。
いやHaskell勉強会に100人も集まるのは、そういう人のほうが少ないだろ
RubyのRedmineに対抗してHedline開発してよ
Redmineが既にあるのにHedlineを開発する動機が無い
>>927 評価者が全員数学系なので、数学系の中ではコスパがいいという話ではあるけど、
そこから一般論としてコスパがいいという結論は導けない。
実現可能で有効性も十分立証できる論拠を持ってこないことには、
圏論をやらなくてはならない理由にはならない。
>>932 俺が思うに
>>327 は一般論として言っているつもりは無いと思う。
「数学系の中では充分に使いものになる」ってのならそれはそれでひとつの知見として有用じゃないかな。
だいたい Haskell は抽象化のために圏論の概念を使ってるんだろ。
だったらその概念を (程度はともかくとして) 理解する必要があるのはあたりまえじゃね?
Java を使うのにオブジェクト指向を理解する必要があるのと同じ。
計算機科学は数学系。 まぁ、現在の計算機科学者自体が学問的に見た場合、数学の出来ない落ち零れなので 数学を否定したがる人がたくさんいるのは、分からないでもない。 そういえば、言語制作者で自分は数学が苦手という恥ずかしいことを言ってる人がいたっけ。
実績もなく数学もダメってんじゃどうしようもないが もしそれで実績があるなら大したものだ…… 数学系がなんとかかんとかよりも、よっぽど有能だろう
有能なのは分かるが、実績があるからと言ってその言語が整合的とは限らない。 というか、ほとんどの言語制作者は整合性を無視しているか、整合性について分かってない。
ここんとこ抽象論が続いてるな 具体的なコード提示してうだうだ議論してる所を眺めたい
言語の整合性なんて気にするユーザーはごく僅かってことですね
重要ではないか、もしくは極端な話、 不整合があるぐらいのほうが実用上良い可能性がある そもそも整合性というのがよく分からないんだが、どうやって評価するんだ?
Haskellやってなお実用的という奴は下に見てる
不整合があるってことは、副作用があるというのと同義じゃ? 実用って言葉を使いたがる人ってようけいるけど、 実用的って言葉ほどマジックワードはないよね。haskellくらいなら ひと通りのものは揃ってるくらいだし。
>>941 > haskellくらいならひと通りのものは揃ってるくらいだし。
ひと通りのものは揃ってるのに、それを利用して
「**を作りました」といってアップする人がほとんどいない
つまり、実用性を外部に身を以て示す人がいない
何故だろ
啓蒙活動が足りない
>>942 いない? 調べもせずにいけしゃあしゃあといいよる
少なくともこのスレにはいないし xmonad、モナディウス、Houseとか正直トイレベルの域出ないでしょ。
最大の啓蒙活動は実用的なプログラムがオープンソースでたくさん出ることなんだけどな。
>>945 トイレレベルかと思ったらおもちゃかww
マイクロソフトのエヴァンジェリストを雇う
ないないない、と言い続ける奴って、 たいてい何があってもそういい続けるビーコンだよな、大抵。
実際ないじゃん。
ベンチャーキャピタルでHaskellを使ってる所が幾つかある、っていうのは聞いたことがあるけど。 Jane StreetはHaskellの従兄弟のOCaml使ってるし、意外な所で使われてるかもよ。 まあ、オープンソースで広く使われてる、っていうと確かにあまり聞かないけど。 Darcsくらい? いつもはLisp方面にいるんだけど、Common Lispのプロジェクトとかで、 Darcs使ってる所とかが何故か多い。
とりあえず数当てゲームでいいから誰か書いてよ
953 :
デフォルトの名無しさん :2011/07/05(火) 11:29:32.27
トイレレベルというがそれを言えるのはトイレレベル以上のソフトウエア を組めるものの特権だよ。そうじゃなければただのバカとしか言いようがない。 そもそも実用といってる人間にとって実用とは何か? もう一歩掘り進んだ意味を答えたほうがいいよ。
なんだよトイレレベルって 突っ込み待ちか?
>>953 ああ?TOTOとINAXディスってるのか?
俺シャワートイレ板の有名コテだからあまり舐めたこと言わないほうがいいよ
>>955 意味不明なんですが。もしなめたことと捉えていて、そのまま、こんご
も舐められたとしたら、あなたはシャワートイレ板でHaskellスレで
舐められたと暴れまくるんですか?トイレ通な人がなん人もこちらに
来るように仕向けて成功するんでしょうか?なにをもってトイレのコ
テハンだということを権威付けしているのかよくわかりません。そろ
そろスレとは無関係なので、これ以上はコメントを差し控えますが。
>>944 調べ方が悪かったのかもしれない
実用性を外部に身を以て示す人を挙げて頂けないか
> 「**を作りました」といってアップする人がほとんどいない
こちらの「ほとんどいない」の方は同意して頂けた認識してよろしいか?
作ろうと思えば作れるんだから今ならそういうの作って名をあげるチャンスと肯定的に捉えよう
>>959 そりゃ聞くまでもなくダメだろ
「実用性を外部に身を以て示す人」なんだから
文章を読まない、論理的に思考できない。そんな人に何をどう説明しろと?
Haskellを使って個々で色々活動してる人は俺も何人か知ってる たぶん、俺が知らないところでもっと多くの人たちが活動してるんだろ でも彼らは「**を作りました」って実用性をアピールしたりはしない しないというのは言い過ぎかも知れんが、そう感じる 個々で、あるいは小グループで黙々と活動してる感じだ まぁ、実は窓の杜のアプリの多くがHaskell製だったりするかもしれんが
話が微妙にずれてる気がするな。
>>942 は実用性の無さを仄めかしてるのかと思ったけど、
単に目立つエヴァンジェリストの不在を指摘したいの? それなら知らないし、いないと思う。
LLとは出自が違うんだし、毛色も違う言語だし、現れにくいんじゃないかな。
それに、Paul Grahamみたいなの、実際いたら鬱陶しいよ? 無駄に叩かれるし。
Larry WallとかGuido van Rossumみたいな感じならまだ救いがあるけど。
ラムちゃんTシャツが?
>>933 前段についてはそのとおりだ。だけど、言葉が足りていないので、
>>927 はHaskellをやる人すべてが圏論を知らないといけないという意味に取れる。
後段についても一理あるものの、別に実際プログラミングするにあたって、
”いちいち厳密で整合性をもたせた数学的な〜”というようなお題目がつきそうな
ものを土台としてプログラムする、なんてストレス溜まって普通に無理だろ。
なんか圏論わかってます系な人に、『こんなプログラムするなんてこいつは
全然圏論わかってない!』とか暗に馬鹿にされるんだろうな〜とか思いながら
プログラムをしたいというなら別だけど。
適当に圏論は箔付けの為だと割りきってひな壇にいてもらうことにして、プログラミング
としては、圏論は尊重はするポーズはするものの完全無視の独立した技法を開発したほうが
絶対良いと思うんだ。
>>963 べつに目立つエヴァンジェリストのレベルまでいかなくていいよ
「こんなん作ったけどどうよ」 って言って「完成させたアプリ」をアップする
こんな程度でいいんだよ
そういうのがちょこちょこっと出てくると、
あぁHaskellって「使えるね」と感じる人が増えてくると思うんだ
でも現実は・・・ そんな人見ないよね
Haskell人口って決して少なくないと思うんだが
なんでだろ? 何が原因なんだろ? という話
>>941 はひと通りのものは揃ってると言うが、もしかしたら何かが足りないとか?
967 :
933 :2011/07/05(火) 21:30:55.37
>>965 いやあ、 Java とかだってデザインパターンわかってます系な人に
『こんなプログラムするなんてこいつは全然デザインパターンをわかってない!』
とか暗に馬鹿にされるんだろうな〜とか思いながらプログラムしたりするよ。
つっても、そのわかってます系の人のわかってるレベルっていうのは
実際には理論を全部網羅してるレベルじゃないだろ。
Haskell 使いは全ての人が圏論を知ってないといけないだろうと思うけど、その程度に知っていれば充分。
私が「程度はともかく」と但書を付けたのはそういうこと。
別に知らなくてもいいよ。<圏論 使ってるうちに興味が沸いて深く理解したければどうぞってやつだ。 プログラミング言語に限らないけど 何かと最初から敷居を上げたがる傾向にあるよね。これはあなただけの 問題ではないから皮肉ってるわけではないよ。 はっきり言ってモナドも理解しなくてもこの時にこう使うということ だけ知っておくだけでとりあえずは作れるよ。だが、そのことは無視して 最初から、敷居を上げたがるから難解に見えるというのはある。 丁度、ポインタを知らなくても動くプログラムはCでも作れるというのと 同じだし、デザパタも同じだよね。オブジェクト指向は知ってると スパゲティ製造言語から逃れられるんだろうか?
そ〜いえば、planet haskellで良くジャーマンメタルの人みたいな人の 記事が上がってるね。ぱっと見てヘヴィメタっぽいおっさんと思ってしまった。
圏論圏論という人は、どこまで理解してるのだろう。 マクレーンくらいは読んでるのか。
>>970 > 圏論圏論という人は、どこまで理解してるのだろう。
> マクレーンくらいは読んでるのか。
あれを読んで理解できれば数学の院生で通用するよ
さらに使いこなせれば数学者の卵ぐらいにはなれる
>>972 数は申し分ないけど、なんかな、なんか違うんだよなぁ
でも、こんなん作ったけどどうよって言って
完成させたアプリをアップする人を見ないというのは、
俺の完全な間違いだと分かった
すまなかった
でもなぁ、日本人がアプリって聞いて想像(期待)するものとは何か違う気がする
アプリの定義なんて無いから、これらもHaskellのアプリだよと言われれば、
そうだよねとしか言えんけど・・・
良くも悪くもこれから、って感じじゃないかなー。
>>958 が言うように、今ならキラーアプリ作って名を上げるチャンスということでひとつ。
数学とズブズブの関係を築くことがトレンドなのか?
数学の気分を味わうだけの言語です
むしろ数学の式は全部Haskellで書いて欲しい 中学ぐらいまでの数学記号は流石に分かるが 高校以降のはさっぱり覚えられなかったぜ 上下左右真ん中のどれがどの引数だったか未だに迷う
そんなんでよく卒業できたな
f(x)で高校数学からドロップアウトした漏れがきました どうやら当時は関数って考え方がまったく理解できなかったらしい
軽い知的障害なんじゃないの
授業中に教師に教えてもらおうと思うと少しも理解できなかったな ってか、教科書は予習・復習で理解してしまうものだろ
すまん予習復習とか宿題以外にしたことがなかった。愚かだった
>>980 いやほらプログラミングならわかりやすい名前のついた関数をまずやって
それから無名関数とか抽象度の高い概念に移るでしょ?
ところが数学はいきなりf(x)だから当時の漏れは困っちゃったという話
煽りにマジレス
985 :
デフォルトの名無しさん :2011/07/06(水) 23:11:09.83
>>982 f(x)の次にg(x)が出てきたろ。
普通の脳ミソがあれば悪くてもその辺で理解できる。
>>983 言葉が足りなかった
高卒をよく卒業できたなと言ったつもりだった
>>983 自分も高卒だが、そこまで理解出来ないなんて事は無かったぞ
>>988 そうか…まあ、数1数Aだけやってそれ以上は授業あんまりなかったからな
割合の計算でどっちを分母にするの分からない人なら大学にたくさんいたが
>>989 。。。。という事は、自分と同じく工業高校卒か
頭良いやつと悪い奴の差が激しいからな。。。
コンプ持ちが使う言語
Haskellスレなのに。 数VCくらいは当然じゃないの、関連は強くないけどこれくらい教養じゃないの
どちらにしてもコンプ持ちが使う言語
>>993 普通高校だと、そう
工業高校はAとTに特化してる
高校数学というと、未だにこの記法が好きになれない (g o f)(x) = g(f(x)) 関数の流れと文字の流れが逆転していて、かなり分かりづらかった記憶がある 大学以降だと、f: x → y みたいな記法が導入されて こっちは自然に読めたんだが
>>991 むしろ高卒っつーたら普通工業とか商業とかで普通高校ではないだろ大概
ちなみに商業もAと1特化で2とBは触りしかやらない
>>993 Haskellのお陰で興味を持てたのよ、高校以降の数学に
そこでf;;gという記法ですよ 圏論関係の文献でたまーに結構使われてる
>>996 その書き方は高校数学とは関係ない。
むしろ代数学的な書き方。
1000だとHaskell で作られたOSが世界を旋回する。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。