トップページtech
1001コメント334KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2012/03/16(金) 21:54:23.92
haskell.org
ttp://www.haskell.org/

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

過去ログ
関数型プログラミング言語Haskell
Part1 ttp://pc.2ch.net/tech/kako/996/996131288.html
Part2 ttp://pc2.2ch.net/test/read.cgi/tech/1013846140/
Part3 ttp://pc8.2ch.net/test/read.cgi/tech/1076418993/
Part4 ttp://pc8.2ch.net/test/read.cgi/tech/1140717775/
Part5 ttp://pc8.2ch.net/test/read.cgi/tech/1149263630/
Part6 ttp://pc11.2ch.net/test/read.cgi/tech/1162902266/
Part7 ttp://pc11.2ch.net/test/read.cgi/tech/1174211797/
Part8 ttp://pc11.2ch.net/test/read.cgi/tech/1193743693/
Part9 ttp://pc11.2ch.net/test/read.cgi/tech/1211010089/
Part10 ttp://pc12.2ch.net/test/read.cgi/tech/1231861873/
Part11 ttp://pc12.2ch.net/test/read.cgi/tech/1252382593/
Part12 ttp://hibari.2ch.net/test/read.cgi/tech/1272536128/
Part13 ttp://hibari.2ch.net/test/read.cgi/tech/1286706874/
Part14 ttp://hibari.2ch.net/test/read.cgi/tech/1299385928/
Part15 ttp://hibari.2ch.net/test/read.cgi/tech/1310199414/
Part16 ttp://toro.2ch.net/test/read.cgi/tech/1317958045/
Part17 ttp://toro.2ch.net/test/read.cgi/tech/1325510368/
0159デフォルトの名無しさん2012/04/18(水) 22:42:45.46
>>157
スパコンのOSはLinixやAIX(IBMのUNIX),IRIX(SGIのUNIX)等、UNIX系OSである。
スパコンのOSはハードウェアである。
したがって、スパコン以外のUNIX系OSもハードウェアである。
0160デフォルトの名無しさん2012/04/18(水) 22:47:24.63
>>158
京はノードに少し改良したLinuxを入れてて、京そのもののOSは移植じゃなくて改良
0161デフォルトの名無しさん2012/04/18(水) 22:55:14.12
>>159
> スパコンのOSはLinixやAIX(IBMのUNIX),IRIX(SGIのUNIX)等、UNIX系OSである。
↓この間に飛躍がある。
>スパコンのOSはハードウェアである。←根拠を省いた断定。
0162デフォルトの名無しさん2012/04/18(水) 23:08:22.98
>>161
別の言い方をしましょう
「例えば、HaskellでプログラミングしてるときのOSって何?」
「Haskellでプログラミングしてるとハイパーキューブとかのハードウェア構造が消えるけど、ハードウェアは何に吸収されたの?」
0163デフォルトの名無しさん2012/04/18(水) 23:14:00.03
>>119が元凶か。IDないと面倒だね
0164デフォルトの名無しさん2012/04/18(水) 23:15:54.30
>>162
それこそ初心者スレへどうぞだよ(OS,UNIX板あたりも含めて)。
もう少しコンピュータのいろはを勉強するか、あるいは無知の知に気がついた方がよい。
ヒント
・言語処理系から見たOSはライブラリの下でsystem callとして呼び出され機能している。
・OSは(というか通信ミドル)はトポロジーを特に隠さない。
 むしろトポロジーを意識して並列分散したほうが性能がでる。
 Haskellがトポロジーを露わに扱う術を持っていないだけである。
0165デフォルトの名無しさん2012/04/19(木) 00:45:36.21
ヒント、とか言って得意げに語りだす奴w
0166デフォルトの名無しさん2012/04/19(木) 00:50:20.71
何の根拠もないのに
「スパコンのOSはハードウェアである。」
とかトンデモな断言をするより遙かにましだろ。

「UNIX系OSもハードウェアである。」
に至っては、初心者スレではなく、もはや病院行けとしか言いようがない。
恥ずかしすぎるので人前では決して言わないように。
0167デフォルトの名無しさん2012/04/19(木) 01:33:45.40
っ鏡
0168 ◆QZaw55cn4c 2012/04/19(木) 02:29:21.51
ふつうのhaskellを読んでいます。
ghc 7.2.1 以降は
import System
とすると、

could nod find module 'System'
It is a member o the hidden package 'haskell98-2.0.0.0'
use -v to see a list of the files searched for.

とでてコンパイルできません
ghc 7.0.4 ではコンパイルできます。
7.2.1 以降でコンパイルできるようにするにはどうしたらいいでしょうか?
環境はWindows7 です。
http://ideone.com/ToAyj
0169デフォルトの名無しさん2012/04/19(木) 02:46:32.16
import System.Environment
にすればおk
0170デフォルトの名無しさん2012/04/19(木) 20:50:07.23
>>164
System call がハードウェアとの接触点ということでしょう
ということは、rawSystem から向こうは全部ハードウェアです

仮に、Haskellプログラムがプログラム上の言明でトポロジーにアクセスできてどのノードのどのLSIのどのメモリのどのビットを1にするか指定していたら、そのプログラムはOSです
0171デフォルトの名無しさん2012/04/19(木) 21:04:49.64
>>166
・コンピュータ科学では、「どのコンピュータの」OSもハードウェアと「原理的に」同一
・一般のコンピュータ科学を知らない人たちは、スパコン業界のハードウェアとOSを同一視している

分からなければ、次の話を考えればいい

今パソコンの中に10cmくらいの512MBのメモリが入っている
この世から、プログラムを高水準のモノから次々の削除していく
一度削除したら、そのプログラムと同じことができるモノは永遠にこの世に出てこない

これを続けていくと、OSが削除されたときに512MBのメモリはハードウェアではなくなり、ただの石になる

もっと言うと、川べりに落ちてるただの石も、その石を動かすシステムがあって、Haskellプログラムからそのシステムにアクセスできて計算に利用できれば、そのシステムはOSであり、そのOSと石はハードウェアになる
0172デフォルトの名無しさん2012/04/19(木) 21:22:33.36
喩えの方が余計わかりにくい
0173デフォルトの名無しさん2012/04/19(木) 21:59:04.77
独自用語とたとえで持論を語り出す電波さん。
持ちネタはそんなにないから、しばらくすれば満足して黙る
0174デフォルトの名無しさん2012/04/19(木) 22:06:58.32
もっとわかりやすく言うと、例えば論文読んでてプログラムからハードウェアへの入力x(t)があったとき、これそのままOSへの入力
例外はOSの論文読んでるときだけ
0175デフォルトの名無しさん2012/04/20(金) 00:43:47.39
>>171
この世にこれほど頭の悪い人を見たことがない。
0176デフォルトの名無しさん2012/04/20(金) 02:42:48.57
>>171
すれ違い迷惑です。退場してください
0177デフォルトの名無しさん2012/04/20(金) 13:03:38.27
Haskellの話しようぜ。そういえば来月 Learn You Haskell ... の日本語訳出るんだよね。
0178デフォルトの名無しさん2012/04/20(金) 16:23:19.18
せっかくだから
http://www.haskell.org/haskellwiki/GHC/Data_Parallel_Haskell
どうよ?
0179デフォルトの名無しさん2012/04/21(土) 22:14:24.35
parallel と concurrent がごっちゃになってる気がしないでもない
0180デフォルトの名無しさん2012/04/22(日) 07:57:37.73
ふむ
ttp://www.haskell.org/ghc/docs/latest/html/users_guide/lang-parallel.html
0181デフォルトの名無しさん2012/04/22(日) 08:05:10.57
並列と並行の定義は微妙に意見分かれるよね
0182デフォルトの名無しさん2012/04/22(日) 11:52:22.81
>>178は最初から最後までparallelの話じゃね?
0183デフォルトの名無しさん2012/04/22(日) 11:55:45.93
data parallelだから当然だな。
0184デフォルトの名無しさん2012/04/24(火) 23:23:42.89
Yampa でのゲーム作りは論文を参考にしてだいたい分りました
(論文のインベーダーを改造したり、ブロック崩しを作ったりしました)

一方、同じく FRP ライブラリの Reactive の方では、
どのようにゲームを作るのか

具体的には、個々のキャラを毎フレーム独立に動かしながら、
かつ互いに(衝突などで)関連を持つようにするには、
どのようなフレームワークを考えれば良いのか
生成や消滅はどのように考えるのか

参考になりそうな文献や記事は無いでしょうか

自分では、イベントとシンクの考え方がユニークで面白いので、
これをゲームオブジェクト間の関連に使えないかと考えているのですが、
他の人はどのように考えているのか、参考にしたいです
0185デフォルトの名無しさん2012/04/25(水) 01:23:27.55
Reactiveはもうメンテされてなくて、今のGHCじゃコンパイルできないから俺はノータッチだけど、
Yampaは、Reactiveなんかの古典FRPを写像変換子のアローとして再構築したライブラリだから、基本的なところの考え方に違いはないはず。

というか、生成、消滅、衝突とかをどう考えたらいいかわからないってのは、FRPの基本的な考えを理解してないからじゃないか?

時間に応じて離散的に変化する値を[(Time, a)]という無限リストだと捉えるのがイベント
時間に応じて連続的に変化する値をTime -> aという型の連続関数だと捉えるのがビヘイビア

こいつらに対して、
定刻tを過ぎたらイベントを発する atTime :: Time -> Event a
ビヘイビアを積分する integral :: Behavior a -> Behavior a
イベントが発生したタイミングで、ビヘイビアの値を補足した新しいイベント作る snapshot :: Behavior a -> Event b -> Event (a, b)

みたいなコンビネータを使ってごにょごにょするのがFRP。

例えば、キャラの移動速度の変化をビヘイビアとして定義して、integralで積分すれば、それが各時刻におけるキャラの位置のビヘイビアになる。
衝突、生成、消滅、キャラのステータス状態の変化、キー入力なんかは、イベントとして考えられるし、
毎フレームの更新自体もイベントとして考えられて、各キャラの更新は

map (flip snapshot updateEvent) charactor

みたいに書けば、それが各フレームのキャラの状態変化を表すイベントになる。
こんな感じで、イベントとビヘイビアを組み合わせて、より複雑なイベントやビヘイビアを作ってく。

とりあえず、Haskell wikiからたどれるリンクを片っ端から読みあさるのが良いと思う。
http://www.haskell.org/haskellwiki/Functional_Reactive_Programming
http://www.haskell.org/haskellwiki/Reactive

本だとSOEが有名。
・The Haskell School of Expression: Learning Functional Programming Through Multimedia
 ttp://www.amazon.co.jp/exec/obidos/ASIN/0521644089/
0186デフォルトの名無しさん2012/04/25(水) 02:00:46.52
ちなみに、Yampaはイベントも矩形波みたいな時刻tの関数だと捉えて、
全てTime -> aという連続関数として考えるのが基本的なアイディア。
イベントやビヘイビアの合成は、

SF a b = (Time -> a) -> (Time -> b)

という写像変換として定義して、その枠組みにアローを使ったと。

古典FRPの概要と欠点とか、AFRPが何を改善したのかとかは
http://www.haskell.org/haskellwiki/Yampa
から辿れる、ITU-FRP2010 のスライドで説明されてるから見とくと良いと思う。
0187デフォルトの名無しさん2012/04/25(水) 04:37:14.33
Haskell的な処理の仕方がどうにも見につかない
実際に使われてるコード読みまくるか
0188デフォルトの名無しさん2012/04/25(水) 19:19:28.33
>>185
Yampa でゲームを作る場合、
pSwitch 系の関数を中心にイベント周りを組み立てるのが一般的ですよね
(論文 The Yampa Arcade や、これを引用してる他の論文などでも基本的にそうなってます)

まず、現在発生しているゲームオブジェクトを全てまとめたコレクションを作っておく

その上で、たとえば pSwitch 関数や dpSwitch 関数を使うのでしたら、
各ゲームオブジェクトや外部入力を起源とするイベント(衝突やビーム発射)を
発生させる関数を第1引数に渡す

コレクションの初期値を第2引数に渡す

第1引数の関数で発生したイベントを、コレクション内のゲームオブジェクトを
生成したり消滅させるイベントに変換する関数を第3引数に渡す

第3引数の関数で発生したイベントを解釈して
実際にコレクションを修正する関数を第4引数に渡す

細かいことはとりあえず抜きにして、大まかにはこんな感じだと思います
こうやって作った pSwith 関数や dpSwitch 関数の戻り値であるシグナル関数に、
ゲームを回すのに必要なシグナルを毎フレーム送るようにする

非常に分りやすく、イベントの伝達がスッキリして、
Yampa はかなり良い基盤を提供してくれると思っているのですが、
こういった基盤は Reactive の方ではどのようになっているのか聞きたいです

Reactive では Yampa みたいなイベント周りの仕組みを一ヶ所に集中させるのとは
また違った方法をとっているのでしょうか
01891842012/04/25(水) 19:22:23.08
>>188
すいません、>>185 が Reactive についてはノータッチなのは分ってますが、
とりあえずどこかへアンカーを付けないと、後から話の流れが追いにくいと思いまして
0190デフォルトの名無しさん2012/04/27(金) 11:55:44.48
まだインクリメンタルGC実装されてないのかよ
0191デフォルトの名無しさん2012/04/27(金) 12:00:24.86
2000年以前に提案があったのにいまだに出来ないというのは実質無理ということなのだろうな
Non-stop Haskell(笑)
0192デフォルトの名無しさん2012/04/27(金) 12:01:31.38
Real Time Haskell
0193デフォルトの名無しさん2012/04/27(金) 12:15:26.39
メモ化による効率化の方法がわからない。。。
λカ娘(二期)を読んだらメモ化には Control.Monad.Memo (cabal install monad-memo)を使うといいよ的な
事が書いてあったのでHackageあたりの文書をチラ見してるけどフィボナッチ数列のメモ化だけの例じゃ
理解できない。。。

Hackageの文書みると「モナディックフォームに変換」とかさらりと書いてるので、もしかしてこれを使える
ようになるためにはモナドがちゃんとわかってないといけないんでしょうかね。

Control.Monad.Memoが使える程度のモナド理解のためのオススメ文書などあったらどなたか教えて
頂けないでしょうか。
0194デフォルトの名無しさん2012/04/27(金) 17:31:00.49
データをグラフにするのにニュープロットとカイロ
どっちのバインディングライブラリが幸せになれるかな
ドザです
0195デフォルトの名無しさん2012/04/27(金) 18:02:32.57
>>193
fib n = fib (n-1) + fib (n-2)

のところを

fib n = let
 n1 = fib (n -1)
 n2 = fib (n - 2)
 in (n1 + n2)

と書いて、モナド形式に変換した〜と言ってる2番目の例と比較してみればわかるんじゃないかな。
do が let、<-が=、returnが(大体)inに対応していると思って。
(これは他のどのモナドでも同じ。do文はモナドによって特殊な振る舞いを組み込む事の出来るlet式。
MonadFixのインスタンスにしてDoRec言語拡張でrecキーワードを有効にしないと再帰束縛はできんけど。)

関数を呼び出す際に、1引数関数(k -> Memo k v)と、値kを取る、memoって関数を介して呼び出すと、kに対する計算結果をメモ化してくれる。
これは、適用演算子($) :: (k -> v) -> k -> vにメモ化機能付けたもの、と考えてもおkだと思う。

異なる関数で相互再帰したりする場合はそれぞれ違うメモモナドを使わないとダメっぽいので、モナド変換子を理解してないとちょっとむずいかも。
0196デフォルトの名無しさん2012/04/27(金) 19:22:43.33
>>190
いまどれぐらいストップザワールドするんだろう?
0197デフォルトの名無しさん2012/04/27(金) 21:15:42.26
>>177
これ、Amazonに登録されてました
0198デフォルトの名無しさん2012/04/27(金) 21:28:53.03
評判の良い本だから楽しみだな
欲を言えば連休中に読みたかった
0199デフォルトの名無しさん2012/04/27(金) 22:33:02.95
>>197
そういう時はURLもお願いします。
ところで同時チェック商品が「情報処理2012年05月号別刷」です。
Haskellユーザは情報科学に興味がある人が多いのですね。

すごいHaskellたのしく学ぼう! (2012/5/23発売)
http://www.amazon.co.jp/dp/4274068854

情報処理2012年05月号別刷
「《特集》CGMの現在と未来: 初音ミク,ニコニコ動画,ピアプロの切り拓いた世界」
http://www.amazon.co.jp/dp/4915256839

え?初音ミクとニコニコ動画特集?
プレミアム会員の私が言うのも何ですが、
Haskellとはユーザ層が被らないとばかり思ってました。
0200デフォルトの名無しさん2012/04/27(金) 23:02:51.55
これがステマというやつか
0201デフォルトの名無しさん2012/04/27(金) 23:13:54.70
まったく。なにがURLもお願いしますだよw
0202デフォルトの名無しさん2012/04/27(金) 23:19:57.80
>>200
ステルスに失礼だろ
02031992012/04/27(金) 23:44:34.50
URLも日本語版のタイトルも書いてないから探すのに無駄に手間取りました。
>>199をステマと思った人は自分の判断力がその程度だと自覚してください。
0204デフォルトの名無しさん2012/04/28(土) 00:26:50.05
Learn You Haskellでググったら一発、
ていうかこのスレにいるような層で原著知らないやついるんだなあ
自分のアンテナが低レベルだと自覚してください
0205デフォルトの名無しさん2012/04/28(土) 01:15:00.48
前スレ736に日本語版タイトルが出ているのを思い出せなかった>>199はアンテナが低レベル。
日本語版を探している人が原著を知らないと判断した>>204は判断力が低レベル。

ということで、以後何もなかったかのようにどうぞ。
0206デフォルトの名無しさん2012/04/28(土) 01:15:22.02
>>203
>>203
>>203
0207デフォルトの名無しさん2012/04/28(土) 01:54:56.47
>>205
いやだからさ、「Learn You Haskell 翻訳」 とかでググったら
日本語版のタイトル出てくるよってことなんだが…
そこまで言わんと分からんかね
0208デフォルトの名無しさん2012/04/28(土) 02:09:15.28
原著知ってれば尼で適当に検索すれば表紙ですぐ分かる
0209デフォルトの名無しさん2012/04/28(土) 02:15:34.87
ttp://learnyouahaskell.com/chapters
ApplicativeとかMonoidの話もあるのか、買いだな
0210デフォルトの名無しさん2012/04/28(土) 06:33:10.05
あー、なんかごめん
0211デフォルトの名無しさん2012/04/28(土) 07:34:34.99
いいってことよ
0212デフォルトの名無しさん2012/04/28(土) 20:07:01.35
GADT

これって、なんて発音するの?
カフェテラスで議論する時に困る
0213デフォルトの名無しさん2012/04/28(土) 20:12:31.04
じーえいでぃーてぃー 以外の発音は聞いたことがない
0214デフォルトの名無しさん2012/04/28(土) 20:29:16.32
そっか

HTML がハトマルだから、GADT も何かあるのかと思ってた

ありがと
0215デフォルトの名無しさん2012/04/28(土) 21:12:57.68
>HTML がハトマルだから
いやいや
0216デフォルトの名無しさん2012/04/28(土) 21:41:36.82
ハテマラだろwwwwwwwwwwww
0217デフォルトの名無しさん2012/04/28(土) 23:08:53.77
GenericなADTだからじーえーでぃーてぃーが自然な発音だろうけど、俺は最初ガッドって読んじゃってこの発音が離れない。
0218デフォルトの名無しさん2012/04/28(土) 23:36:16.79
ガドト派はいないの?
0219デフォルトの名無しさん2012/04/28(土) 23:44:01.61
俺もpwdコマンドがプリントワーキングディレクトリだけど
パウドゥって脳内で響くのが治まらない
プワディって呼ぼうかな
0220デフォルトの名無しさん2012/04/29(日) 00:27:16.78
言語拡張オプション名が GADTs だから GADT もいっしょにガッツって読んでる
0221デフォルトの名無しさん2012/04/29(日) 02:34:16.91
>>195
ありがとうございます。モナドをもう少し真面目に勉強してみます。
0222デフォルトの名無しさん2012/04/29(日) 10:54:07.47
>>217
> GenericなADTだからじーえーでぃーてぃーが自然な発音だろうけど、俺は最初ガッドって読んじゃってこの発音が離れない。

私もこれ
0223デフォルトの名無しさん2012/04/29(日) 12:25:33.10
リワハで勉強していくとモナドトランスフォーマ辺りで脳が軋む
この書籍、後半部分に誤植が多発してるね
0224デフォルトの名無しさん2012/04/29(日) 12:40:02.36
リワハwww
0225デフォルトの名無しさん2012/04/29(日) 12:53:35.88
>>223
モナド変換子はマジむずい。
あれは理屈を理解するよりも、コンパイルして怒られてを繰り返して体で覚えた方がはやいかもしれない。
まずはliftIOだけ使って、コードのどの部分がどんな型になってんのか把握できるようになるまでガンバレ。
0226デフォルトの名無しさん2012/04/29(日) 14:07:50.00
さぁ次はmonad-controlの攻略だ・・・
0227デフォルトの名無しさん2012/04/29(日) 14:22:11.84
それよりも Arrow のやさしい解説本を洋書でも良いから誰か書いてくれよ

ところで、Arrow の利用って FRP かパーサーくらいしかないの?
0228デフォルトの名無しさん2012/04/29(日) 14:46:37.22
Arrowよか最近はconduitやら何やらのComonad系のやり方の方が熱いと聞いた
しかしComonadはArrowよかさらに文献が少ないと言うw
0229デフォルトの名無しさん2012/04/29(日) 15:41:09.55
>>227
Arrowの導入は「関数プログラミングの楽しみ」に1章分だけど出てる
印象としては抽象度が高すぎてかえって使いづらい
始めからArrowとして設計されてたら、もっと使い勝手がよかったと思う
0230デフォルトの名無しさん2012/04/29(日) 16:03:42.43
>>229
うん、持ってる

> 抽象度が高すぎて
まさにこれ、やさしいとは言いがたい

ネット上の解説も、回路図で first とか right とか説明して、
最後にこれが大ボスと言わんばかりに loop をちょろっと解説して終わりなのが多い
しかも、どれも抽象的

なんかこう、実例みたいなのが無いんだよなぁ

ひとつ論文で、パーサーの例を挙げて、
こうすればスペースリークを防げるよねって解説があったけど、
あれがまだましな方だったな(論文の方が分りやすいってどうよと思うが)
0231デフォルトの名無しさん2012/04/29(日) 16:57:45.72
(>>=)って左結合なのにどうして左の方で束縛した値が右の方で使えるの?

     __
((((((((((束縛)  )  )  )参照)  )  )  )  )  )

スコープ的にどうなってんの?


右結合だったら自然に見える事は理解できるんだが
      _______________________
(  (  (束縛(  (  (  (  (  (参照(´・ω・`))))))))))
0232デフォルトの名無しさん2012/04/29(日) 17:10:59.47
>>231
モナド則でこうなってるから
(m >>= f) >>= g == m >>= (\x -> f x >>= g)
0233デフォルトの名無しさん2012/04/29(日) 17:21:25.38
>>231
(>>=)は左結合だけどdoは右結合だから問題ない
明示的に(>>=)とラムダを使う場合でも、
a >>= \x ->
b >>= \y ->
c
なら、
a >>= (\x ->
b >>= (\y ->
c))
のことだから、やはり問題ない(ラムダ式は可能な限り右まで続く)

>>232
モナド則は関係ない
0234デフォルトの名無しさん2012/04/29(日) 18:17:44.38
>>233
……infixl 1と宣言しておきながら、事実上は右結合なんですか?

右結合って短絡可能なんですよね?

Maybeモナドでは
左にNothingなら問答無用でNothing
ってなってるけど

処理が右結合で、途中Nothingに出逢ったら
Real World Haskellではそのまま最後までNothing伝播処理が続くって書いてあった

でも僕の考える限りでは、右結合では右側が判明するまでの必要最低限の努力をするのが遅延評価だから
途中でNothingに出逢った瞬間からスタック巻き戻しのようになると思うのですが……


/\
 /\
  /\
  N /\
    /\
      :
      /\
       /\
/\
 /\
   N
/\
  N

Nothing
0235デフォルトの名無しさん2012/04/29(日) 19:24:55.15
>>234
構文の話と意味の話をごっちゃにしてないか
左結合(infixl)というのは、あくまで
a >>= b >>= c
というふうに使ったときに
(a >>= b) >>= c
と解釈される、というだけの意味。それ以外の使い方をした場合には関係ない

後半はその通りで、(Nothing>>=f)はfを呼ばないから、たとえばdoの中でNothing
が出て来たらそれ以降は評価すらしない
そのNothingが別のdo(呼び出し元の関数とか)に渡ったときには
Nothingの伝播処理が挟まる
0236デフォルトの名無しさん2012/04/29(日) 21:27:11.79
>>235
質問@
 Maybe 上で (>>=) あるいは (>>) を使ってたくさんの計算を連鎖するとき、
その計算のどれかが Nothing を返したら、残りの計算は一切評価されません。
 しかしこの連鎖は完全には短絡されていないことに注目しましょう。
連鎖中のそれぞれの (>>=) や (>>) は左の Nothing にマッチすると右に Nothing を生成し、
最後までそうしていきます。この点は忘れやすいものです。
連鎖中の計算が失敗したとき、それに続くNothing 値の生成、連鎖、消費は実行時に安価ではありますが、タダというわけではありません。


348 P にこう書いてありますが、私にはこの文脈が左結合を示唆しているかのように見受けられます。つまりは、
  /\
 /\
/\
N
 /\
/\
N

/\
N

Nothing
こう主張しているように思えるのです。短絡は起きていないように思えます。

ここで私のいう短絡とは、関数処理のスキップのみならず木構造の一発切除をも意味します
Nothingに出逢った瞬間全てを忘れて即Nothingです

これは無理なのでしょうか?
0237デフォルトの名無しさん2012/04/29(日) 21:31:47.75
>>235
質問A
余談ですが考えてもみれば、左結合は(関数処理は省けても)そのまま最後まで構造が進むしか無いようで、
一方で右結合は構造も短絡できるかのように見えますが、
構造の最後の方でNothingが発生するか、結局最後まで発生しなかった場合を想像すると、
スタック巻き戻しを考慮に入れると、行って戻ることになり、
最後まで構造をなぞるどころかその2倍弱の手間になるかも知れませんね。

より最初の方でNothingが出る期待が高い時は右結合
そうでない時は安定的な左結合が適切なんでしょうか?

Data.List.and と or は右結合で定義されていますが
これは何を意識してのことでしょうか?

and/orの最後の方でFalse/Trueがでるか、あるいは最後まで出ない時、
(これは直感ですが)リストの半分を越えてから結論出せる状況になったら、
正格左結合よりも酷いパフォーマンスになるのではないでしょうか?

スタックを巻き戻すだけというのが、パターンマッチングで値を返す処理に比べて、
凄く速いのならそんな事は無いといえるのでしょうが。
0238デフォルトの名無しさん2012/04/29(日) 22:32:05.06
木構造だとか関数処理とか怪しい概念は窓から放り投げて定義の展開と代入、簡約で考えよう
その辺はRWHよかIntroduction to Functional Programming using Haskellの方が詳しいyp

andやorが右結合なのは無限リスト食わせるとわかる
foldlで定義したら食わせるリストの頭に零因子であるものがあってもスタック食いつぶす

Maybeに関しての短絡はNothing >> forever (Just 1)とかするとわかる
これが木構造とやらを切除しないとなるとサイズが無限である木がメモリ上に存在してスタックオーバーフロー起こす事になる
0239デフォルトの名無しさん2012/04/29(日) 23:59:04.07
初心者に信用されてないんだなあHaskell
0240デフォルトの名無しさん2012/04/30(月) 03:31:17.36
手持ちの情報だけで突っ走ってしまう人がいるのはHaskellに限った話ではない
0241デフォルトの名無しさん2012/04/30(月) 09:20:17.79
>>239
「信用」の意味がよく分らないです

Haskell は初心者から、本来あるべきどのような信用がないのでしょうか
0242デフォルトの名無しさん2012/04/30(月) 09:55:23.07
>>214
くっそこんなので笑わされるとは
0243デフォルトの名無しさん2012/04/30(月) 10:03:34.53
鳩丸
0244デフォルトの名無しさん2012/04/30(月) 11:13:59.36
暗黙の型変換の仕組みは Haskell では作れないのでしょうか(GHC の拡張機能なとで)

例えばリテラルからの暗黙の型変換は一部ありますよね
Num.fromInteger 関数とか IsString.fromString 関数を定義しておけば、
リテラル整数や文字列を適切な型にコンパイラが自動的に変換してくれる
(後者は GHC の拡張機能ですが)

これの延長で、例えば OpenGL を使っていて、
GLdouble 型を引数に取る関数を Double 型に適用しようとした時、
何か特別な定義をしておけば、realToFrac 関数を使わずとも、
コンパイラが自動的に変換してくれるとか

このような例だけでなく、一般的に fromIntegral 関数とか realToFrac 関数って、
けっこう目障りなんですよね

これらって、型推論出来るようにコードを書かなければならないという、
どちらかと言うと言語仕様よりの概念じゃないですか
そのわりに、realToFrac 関数だけでは、ぱっと見、何から何への変換か分らない

一方で、これらの関数が使われているコードは、
何を計算するのかという、もっと抽象度の高い概念をコード化しているわけで

抽象度の高いコードの中に、抽象度の低い「おまじない」の様なコードが
けっこう大きな石ころのように混ざっている状況が、なんとも違和感を覚える

どうにかならないものでしょうか
0245デフォルトの名無しさん2012/04/30(月) 11:26:54.17
>>241
うーん、言語の設計者より自分の方が頭いいかもしんない、と思われちゃってるところ。
0246デフォルトの名無しさん2012/04/30(月) 11:45:17.37
どうでもいいレスに反応して戦線を拡大したがるあたり
抽象度とか言いつつ全体が見えていない
0247デフォルトの名無しさん2012/04/30(月) 11:57:23.83
>>238
有難うございました(´;ω;)
0248デフォルトの名無しさん2012/04/30(月) 14:53:15.43
GHCiで入力に関して、重複する履歴は考慮しないようにするにはどうしますか?
上を押しても同じ履歴だった場合、動いてないように見えてストレスとなります
0249デフォルトの名無しさん2012/04/30(月) 15:06:17.22
>>248
残念ながら現状ではどうにもならない

なにかストレスを発散する方法を考えてくれ
0250デフォルトの名無しさん2012/04/30(月) 15:30:36.77
サンクスエニウェイ
0251デフォルトの名無しさん2012/04/30(月) 18:34:46.96
haskelineを直してパッチ送ればいいんじゃね
0252デフォルトの名無しさん2012/04/30(月) 18:36:44.31
むしろこのスレの初心者の扱いの酷さに引いた
0253デフォルトの名無しさん2012/04/30(月) 18:38:36.11
定番の頭の悪い攻撃ですな
0254デフォルトの名無しさん2012/04/30(月) 23:24:32.16
初心者質問スレはまだ不要?
0255デフォルトの名無しさん2012/04/30(月) 23:33:00.05
今まで初心者らしい素朴な質問を見たことがない

・どうやってボタン表示するんですか
・ループが出来ません
・変数変えれないんですけど

そんな質問しねーよ、って人ならもう初心者じゃない

具体的に「Haskellでやりたいこと」を見つけて取り組んでくれ
分かんないことがあったらピンポイントで質問してこい
あたしらが優しく相手してやる
0256デフォルトの名無しさん2012/05/01(火) 00:09:38.80
HappyのGLR機能が保守放棄されている(現行のghcで動かない。バグもあるらしい)のですが、
今生きているHaskellのGLRパーサはありませんか?
0257デフォルトの名無しさん2012/05/01(火) 03:16:34.46
>>255
お、お前……女だったのか……。
0258デフォルトの名無しさん2012/05/01(火) 03:22:27.79
Haskellでメタプログラミングしたいんですけど,
具体的には今あるコード資産に対してコード変換して,機能拡張したい,
そのための便利な仕組みない
■ このスレッドは過去ログ倉庫に格納されています