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


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

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



1 名前:デフォルトの名無しさん [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/

159 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 22:42:45.46 ]
>>157
スパコンのOSはLinixやAIX(IBMのUNIX),IRIX(SGIのUNIX)等、UNIX系OSである。
スパコンのOSはハードウェアである。
したがって、スパコン以外のUNIX系OSもハードウェアである。

160 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 22:47:24.63 ]
>>158
京はノードに少し改良したLinuxを入れてて、京そのもののOSは移植じゃなくて改良

161 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 22:55:14.12 ]
>>159
> スパコンのOSはLinixやAIX(IBMのUNIX),IRIX(SGIのUNIX)等、UNIX系OSである。
↓この間に飛躍がある。
>スパコンのOSはハードウェアである。←根拠を省いた断定。

162 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 23:08:22.98 ]
>>161
別の言い方をしましょう
「例えば、HaskellでプログラミングしてるときのOSって何?」
「Haskellでプログラミングしてるとハイパーキューブとかのハードウェア構造が消えるけど、ハードウェアは何に吸収されたの?」

163 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 23:14:00.03 ]
>>119が元凶か。IDないと面倒だね

164 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 23:15:54.30 ]
>>162
それこそ初心者スレへどうぞだよ(OS,UNIX板あたりも含めて)。
もう少しコンピュータのいろはを勉強するか、あるいは無知の知に気がついた方がよい。
ヒント
・言語処理系から見たOSはライブラリの下でsystem callとして呼び出され機能している。
・OSは(というか通信ミドル)はトポロジーを特に隠さない。
 むしろトポロジーを意識して並列分散したほうが性能がでる。
 Haskellがトポロジーを露わに扱う術を持っていないだけである。

165 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 00:45:36.21 ]
ヒント、とか言って得意げに語りだす奴w

166 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 00:50:20.71 ]
何の根拠もないのに
「スパコンのOSはハードウェアである。」
とかトンデモな断言をするより遙かにましだろ。

「UNIX系OSもハードウェアである。」
に至っては、初心者スレではなく、もはや病院行けとしか言いようがない。
恥ずかしすぎるので人前では決して言わないように。

167 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 01:33:45.40 ]
っ鏡



168 名前: ◆QZaw55cn4c mailto:sage [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 です。
ideone.com/ToAyj

169 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 02:46:32.16 ]
import System.Environment
にすればおk

170 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 20:50:07.23 ]
>>164
System call がハードウェアとの接触点ということでしょう
ということは、rawSystem から向こうは全部ハードウェアです

仮に、Haskellプログラムがプログラム上の言明でトポロジーにアクセスできてどのノードのどのLSIのどのメモリのどのビットを1にするか指定していたら、そのプログラムはOSです

171 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 21:04:49.64 ]
>>166
・コンピュータ科学では、「どのコンピュータの」OSもハードウェアと「原理的に」同一
・一般のコンピュータ科学を知らない人たちは、スパコン業界のハードウェアとOSを同一視している

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

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

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

もっと言うと、川べりに落ちてるただの石も、その石を動かすシステムがあって、Haskellプログラムからそのシステムにアクセスできて計算に利用できれば、そのシステムはOSであり、そのOSと石はハードウェアになる

172 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 21:22:33.36 ]
喩えの方が余計わかりにくい

173 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 21:59:04.77 ]
独自用語とたとえで持論を語り出す電波さん。
持ちネタはそんなにないから、しばらくすれば満足して黙る

174 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 22:06:58.32 ]
もっとわかりやすく言うと、例えば論文読んでてプログラムからハードウェアへの入力x(t)があったとき、これそのままOSへの入力
例外はOSの論文読んでるときだけ

175 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 00:43:47.39 ]
>>171
この世にこれほど頭の悪い人を見たことがない。

176 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 02:42:48.57 ]
>>171
すれ違い迷惑です。退場してください

177 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 13:03:38.27 ]
Haskellの話しようぜ。そういえば来月 Learn You Haskell ... の日本語訳出るんだよね。



178 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 16:23:19.18 ]
せっかくだから
www.haskell.org/haskellwiki/GHC/Data_Parallel_Haskell
どうよ?

179 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 22:14:24.35 ]
parallel と concurrent がごっちゃになってる気がしないでもない

180 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 07:57:37.73 ]
ふむ
ttp://www.haskell.org/ghc/docs/latest/html/users_guide/lang-parallel.html

181 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 08:05:10.57 ]
並列と並行の定義は微妙に意見分かれるよね

182 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 11:52:22.81 ]
>>178は最初から最後までparallelの話じゃね?

183 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 11:55:45.93 ]
data parallelだから当然だな。

184 名前:デフォルトの名無しさん mailto:sage [2012/04/24(火) 23:23:42.89 ]
Yampa でのゲーム作りは論文を参考にしてだいたい分りました
(論文のインベーダーを改造したり、ブロック崩しを作ったりしました)

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

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

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

自分では、イベントとシンクの考え方がユニークで面白いので、
これをゲームオブジェクト間の関連に使えないかと考えているのですが、
他の人はどのように考えているのか、参考にしたいです

185 名前:デフォルトの名無しさん mailto:sage [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からたどれるリンクを片っ端から読みあさるのが良いと思う。
www.haskell.org/haskellwiki/Functional_Reactive_Programming
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/

186 名前:デフォルトの名無しさん mailto:sage [2012/04/25(水) 02:00:46.52 ]
ちなみに、Yampaはイベントも矩形波みたいな時刻tの関数だと捉えて、
全てTime -> aという連続関数として考えるのが基本的なアイディア。
イベントやビヘイビアの合成は、

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

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

古典FRPの概要と欠点とか、AFRPが何を改善したのかとかは
www.haskell.org/haskellwiki/Yampa
から辿れる、ITU-FRP2010 のスライドで説明されてるから見とくと良いと思う。

187 名前:デフォルトの名無しさん mailto:sage [2012/04/25(水) 04:37:14.33 ]
Haskell的な処理の仕方がどうにも見につかない
実際に使われてるコード読みまくるか



188 名前:デフォルトの名無しさん mailto:sage [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 みたいなイベント周りの仕組みを一ヶ所に集中させるのとは
また違った方法をとっているのでしょうか


189 名前:184 mailto:sage [2012/04/25(水) 19:22:23.08 ]
>>188
すいません、>>185 が Reactive についてはノータッチなのは分ってますが、
とりあえずどこかへアンカーを付けないと、後から話の流れが追いにくいと思いまして

190 名前:デフォルトの名無しさん mailto:sage [2012/04/27(金) 11:55:44.48 ]
まだインクリメンタルGC実装されてないのかよ

191 名前:デフォルトの名無しさん mailto:sage [2012/04/27(金) 12:00:24.86 ]
2000年以前に提案があったのにいまだに出来ないというのは実質無理ということなのだろうな
Non-stop Haskell(笑)

192 名前:デフォルトの名無しさん mailto:sage [2012/04/27(金) 12:01:31.38 ]
Real Time Haskell

193 名前:デフォルトの名無しさん mailto:sage [2012/04/27(金) 12:15:26.39 ]
メモ化による効率化の方法がわからない。。。
λカ娘(二期)を読んだらメモ化には Control.Monad.Memo (cabal install monad-memo)を使うといいよ的な
事が書いてあったのでHackageあたりの文書をチラ見してるけどフィボナッチ数列のメモ化だけの例じゃ
理解できない。。。

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

Control.Monad.Memoが使える程度のモナド理解のためのオススメ文書などあったらどなたか教えて
頂けないでしょうか。

194 名前:デフォルトの名無しさん mailto:sage [2012/04/27(金) 17:31:00.49 ]
データをグラフにするのにニュープロットとカイロ
どっちのバインディングライブラリが幸せになれるかな
ドザです

195 名前:デフォルトの名無しさん mailto:sage [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だと思う。

異なる関数で相互再帰したりする場合はそれぞれ違うメモモナドを使わないとダメっぽいので、モナド変換子を理解してないとちょっとむずいかも。

196 名前:デフォルトの名無しさん mailto:sage [2012/04/27(金) 19:22:43.33 ]
>>190
いまどれぐらいストップザワールドするんだろう?

197 名前:デフォルトの名無しさん mailto:sage [2012/04/27(金) 21:15:42.26 ]
>>177
これ、Amazonに登録されてました



198 名前:デフォルトの名無しさん mailto:sage [2012/04/27(金) 21:28:53.03 ]
評判の良い本だから楽しみだな
欲を言えば連休中に読みたかった

199 名前:デフォルトの名無しさん mailto:sage [2012/04/27(金) 22:33:02.95 ]
>>197
そういう時はURLもお願いします。
ところで同時チェック商品が「情報処理2012年05月号別刷」です。
Haskellユーザは情報科学に興味がある人が多いのですね。

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

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

え?初音ミクとニコニコ動画特集?
プレミアム会員の私が言うのも何ですが、
Haskellとはユーザ層が被らないとばかり思ってました。

200 名前:デフォルトの名無しさん mailto:sage [2012/04/27(金) 23:02:51.55 ]
これがステマというやつか

201 名前:デフォルトの名無しさん mailto:sage [2012/04/27(金) 23:13:54.70 ]
まったく。なにがURLもお願いしますだよw

202 名前:デフォルトの名無しさん mailto:sage [2012/04/27(金) 23:19:57.80 ]
>>200
ステルスに失礼だろ

203 名前:199 mailto:sage [2012/04/27(金) 23:44:34.50 ]
URLも日本語版のタイトルも書いてないから探すのに無駄に手間取りました。
>>199をステマと思った人は自分の判断力がその程度だと自覚してください。

204 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 00:26:50.05 ]
Learn You Haskellでググったら一発、
ていうかこのスレにいるような層で原著知らないやついるんだなあ
自分のアンテナが低レベルだと自覚してください

205 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 01:15:00.48 ]
前スレ736に日本語版タイトルが出ているのを思い出せなかった>>199はアンテナが低レベル。
日本語版を探している人が原著を知らないと判断した>>204は判断力が低レベル。

ということで、以後何もなかったかのようにどうぞ。

206 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 01:15:22.02 ]
>>203
>>203
>>203

207 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 01:54:56.47 ]
>>205
いやだからさ、「Learn You Haskell 翻訳」 とかでググったら
日本語版のタイトル出てくるよってことなんだが…
そこまで言わんと分からんかね



208 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 02:09:15.28 ]
原著知ってれば尼で適当に検索すれば表紙ですぐ分かる

209 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 02:15:34.87 ]
ttp://learnyouahaskell.com/chapters
ApplicativeとかMonoidの話もあるのか、買いだな

210 名前:デフォルトの名無しさん mailto:197 [2012/04/28(土) 06:33:10.05 ]
あー、なんかごめん

211 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 07:34:34.99 ]
いいってことよ

212 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 20:07:01.35 ]
GADT

これって、なんて発音するの?
カフェテラスで議論する時に困る

213 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 20:12:31.04 ]
じーえいでぃーてぃー 以外の発音は聞いたことがない

214 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 20:29:16.32 ]
そっか

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

ありがと

215 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 21:12:57.68 ]
>HTML がハトマルだから
いやいや

216 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 21:41:36.82 ]
ハテマラだろwwwwwwwwwwww

217 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 23:08:53.77 ]
GenericなADTだからじーえーでぃーてぃーが自然な発音だろうけど、俺は最初ガッドって読んじゃってこの発音が離れない。



218 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 23:36:16.79 ]
ガドト派はいないの?

219 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 23:44:01.61 ]
俺もpwdコマンドがプリントワーキングディレクトリだけど
パウドゥって脳内で響くのが治まらない
プワディって呼ぼうかな

220 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 00:27:16.78 ]
言語拡張オプション名が GADTs だから GADT もいっしょにガッツって読んでる

221 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 02:34:16.91 ]
>>195
ありがとうございます。モナドをもう少し真面目に勉強してみます。

222 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 10:54:07.47 ]
>>217
> GenericなADTだからじーえーでぃーてぃーが自然な発音だろうけど、俺は最初ガッドって読んじゃってこの発音が離れない。

私もこれ

223 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 12:25:33.10 ]
リワハで勉強していくとモナドトランスフォーマ辺りで脳が軋む
この書籍、後半部分に誤植が多発してるね

224 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 12:40:02.36 ]
リワハwww

225 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 12:53:35.88 ]
>>223
モナド変換子はマジむずい。
あれは理屈を理解するよりも、コンパイルして怒られてを繰り返して体で覚えた方がはやいかもしれない。
まずはliftIOだけ使って、コードのどの部分がどんな型になってんのか把握できるようになるまでガンバレ。

226 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 14:07:50.00 ]
さぁ次はmonad-controlの攻略だ・・・

227 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 14:22:11.84 ]
それよりも Arrow のやさしい解説本を洋書でも良いから誰か書いてくれよ

ところで、Arrow の利用って FRP かパーサーくらいしかないの?



228 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 14:46:37.22 ]
Arrowよか最近はconduitやら何やらのComonad系のやり方の方が熱いと聞いた
しかしComonadはArrowよかさらに文献が少ないと言うw

229 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 15:41:09.55 ]
>>227
Arrowの導入は「関数プログラミングの楽しみ」に1章分だけど出てる
印象としては抽象度が高すぎてかえって使いづらい
始めからArrowとして設計されてたら、もっと使い勝手がよかったと思う

230 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 16:03:42.43 ]
>>229
うん、持ってる

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

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

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

ひとつ論文で、パーサーの例を挙げて、
こうすればスペースリークを防げるよねって解説があったけど、
あれがまだましな方だったな(論文の方が分りやすいってどうよと思うが)

231 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 16:57:45.72 ]
(>>=)って左結合なのにどうして左の方で束縛した値が右の方で使えるの?

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

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


右結合だったら自然に見える事は理解できるんだが
      _______________________
(  (  (束縛(  (  (  (  (  (参照(´・ω・`))))))))))

232 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 17:10:59.47 ]
>>231
モナド則でこうなってるから
(m >>= f) >>= g == m >>= (\x -> f x >>= g)

233 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 17:21:25.38 ]
>>231
(>>=)は左結合だけどdoは右結合だから問題ない
明示的に(>>=)とラムダを使う場合でも、
a >>= \x ->
b >>= \y ->
c
なら、
a >>= (\x ->
b >>= (\y ->
c))
のことだから、やはり問題ない(ラムダ式は可能な限り右まで続く)

>>232
モナド則は関係ない

234 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 18:17:44.38 ]
>>233
……infixl 1と宣言しておきながら、事実上は右結合なんですか?

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

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

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

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


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

Nothing

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

後半はその通りで、(Nothing>>=f)はfを呼ばないから、たとえばdoの中でNothing
が出て来たらそれ以降は評価すらしない
そのNothingが別のdo(呼び出し元の関数とか)に渡ったときには
Nothingの伝播処理が挟まる

236 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 21:27:11.79 ]
>>235
質問@
 Maybe 上で (>>=) あるいは (>>) を使ってたくさんの計算を連鎖するとき、
その計算のどれかが Nothing を返したら、残りの計算は一切評価されません。
 しかしこの連鎖は完全には短絡されていないことに注目しましょう。
連鎖中のそれぞれの (>>=) や (>>) は左の Nothing にマッチすると右に Nothing を生成し、
最後までそうしていきます。この点は忘れやすいものです。
連鎖中の計算が失敗したとき、それに続くNothing 値の生成、連鎖、消費は実行時に安価ではありますが、タダというわけではありません。


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

/\
N

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

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

これは無理なのでしょうか?

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

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

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

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

スタックを巻き戻すだけというのが、パターンマッチングで値を返す処理に比べて、
凄く速いのならそんな事は無いといえるのでしょうが。



238 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 22:32:05.06 ]
木構造だとか関数処理とか怪しい概念は窓から放り投げて定義の展開と代入、簡約で考えよう
その辺はRWHよかIntroduction to Functional Programming using Haskellの方が詳しいyp

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

Maybeに関しての短絡はNothing >> forever (Just 1)とかするとわかる
これが木構造とやらを切除しないとなるとサイズが無限である木がメモリ上に存在してスタックオーバーフロー起こす事になる

239 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 23:59:04.07 ]
初心者に信用されてないんだなあHaskell

240 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 03:31:17.36 ]
手持ちの情報だけで突っ走ってしまう人がいるのはHaskellに限った話ではない

241 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 09:20:17.79 ]
>>239
「信用」の意味がよく分らないです

Haskell は初心者から、本来あるべきどのような信用がないのでしょうか

242 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 09:55:23.07 ]
>>214
くっそこんなので笑わされるとは

243 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 10:03:34.53 ]
鳩丸

244 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 11:13:59.36 ]
暗黙の型変換の仕組みは Haskell では作れないのでしょうか(GHC の拡張機能なとで)

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

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

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

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

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

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

どうにかならないものでしょうか

245 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 11:26:54.17 ]
>>241
うーん、言語の設計者より自分の方が頭いいかもしんない、と思われちゃってるところ。

246 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 11:45:17.37 ]
どうでもいいレスに反応して戦線を拡大したがるあたり
抽象度とか言いつつ全体が見えていない

247 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 11:57:23.83 ]
>>238
有難うございました(´;ω;)



248 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 14:53:15.43 ]
GHCiで入力に関して、重複する履歴は考慮しないようにするにはどうしますか?
上を押しても同じ履歴だった場合、動いてないように見えてストレスとなります

249 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 15:06:17.22 ]
>>248
残念ながら現状ではどうにもならない

なにかストレスを発散する方法を考えてくれ

250 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 15:30:36.77 ]
サンクスエニウェイ

251 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 18:34:46.96 ]
haskelineを直してパッチ送ればいいんじゃね

252 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 18:36:44.31 ]
むしろこのスレの初心者の扱いの酷さに引いた

253 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 18:38:36.11 ]
定番の頭の悪い攻撃ですな

254 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 23:24:32.16 ]
初心者質問スレはまだ不要?

255 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 23:33:00.05 ]
今まで初心者らしい素朴な質問を見たことがない

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

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

具体的に「Haskellでやりたいこと」を見つけて取り組んでくれ
分かんないことがあったらピンポイントで質問してこい
あたしらが優しく相手してやる

256 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 00:09:38.80 ]
HappyのGLR機能が保守放棄されている(現行のghcで動かない。バグもあるらしい)のですが、
今生きているHaskellのGLRパーサはありませんか?

257 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 03:16:34.46 ]
>>255
お、お前……女だったのか……。



258 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 03:22:27.79 ]
Haskellでメタプログラミングしたいんですけど,
具体的には今あるコード資産に対してコード変換して,機能拡張したい,
そのための便利な仕組みない

259 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 04:32:54.50 ]
>>252
いんや?
自分が初心者の頃、親切に教えてもらったぞ?

プログラミングHaskellで最初に詰まって、散々悩んだreplicateのリスト内包表記版を作れって問題とか

初心者でも、replicateの再起版はすぐに思いついたんだが、この頃は本当に頭が固かったな・・・
(ヒントがlengthのリスト内包表記版の応用って書かれてても、全然思い浮かばんかった)

回答してもらって、ああ、なるほど、lengthのリスト内包表記版の応用だ。ってやっと納得できたっけ

そもそもHaskellはRubyとかと違って、組込み関数も自分で簡単に作れるってのが初心者の頃の自分には言語の理解の助けになった
普段自分の使ってる関数の動きを自分で同じ関数作って確認しながら覚えられるから、あんまり基本的過ぎる質問ってする必要が無かったし、
>>255同様、初心者らしい質問って、そもそもHaskell(または関数型言語)ってどんな言語?とか以外じゃ見ない(それも最初のスレだけだったような・・・)
当時の自分の質問が一番初心者らしい質問だったと思う







[ 続きを読む ] / [ 携帯版 ]

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

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