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


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

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



1 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 16:41:29 ]
haskell.org
www.haskell.org/

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

過去ログ
関数型プログラミング言語Haskell
Part1 pc.2ch.net/tech/kako/996/996131288.html
Part2 pc2.2ch.net/test/read.cgi/tech/1013846140/
Part3 pc8.2ch.net/test/read.cgi/tech/1076418993/
Part4 pc8.2ch.net/test/read.cgi/tech/1140717775/
Part5 pc8.2ch.net/test/read.cgi/tech/1149263630/
Part6 pc11.2ch.net/test/read.cgi/tech/1162902266/
Part7 pc11.2ch.net/test/read.cgi/tech/1174211797/
Part8 pc11.2ch.net/test/read.cgi/tech/1193743693/
・2chの仕様により、行頭の半角スペースは表示されません。
 コードをインデントしたいときは、代わりに または全角スペースを使うことができます。


459 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 15:23:20 ]
>>455
そこ載ってなくね?w
research.microsoft.com/~simonpj/Papers/slpj-book-1987/index.htm
research.microsoft.com/~simonpj/Papers/pj-lester-book/

>>457
サンクス。目次しか見てないけど、
Implementationがパターンマッチや型など広く扱ってて、
Implementingはコンパイラのコアな部分を主に扱ってる感じ?
静的型付けとグラフ簡約の運命的な出会いというからそうでもない?
まあImplementingのほうを読んでみます。

>>458
そうですね。

460 名前:デフォルトの名無しさん mailto:sage [2008/08/10(日) 16:23:15 ]
載ってるよー

グラフ簡約と運命的な出会いというと遅延評価じゃないかね。
特にPJ的には。

461 名前:419 mailto:sage [2008/08/11(月) 14:41:51 ]
>>460
まあグラフ簡約は前提として、それを効率的に実装するには静的型付けがイイんだよ、
と、約20年前に読んだ時に思った。

462 名前:419 mailto:sage [2008/08/11(月) 14:44:37 ]
20年前じゃなくて15年前だった。かなり記憶が混乱してるな、俺 orz

463 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 16:05:22 ]
>>461
あまり理解できてなかったんじゃない?w

464 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 16:13:31 ]
>>463
かもしれない。
できれば君が読んでポイントだと思ったところを挙げてくれると皆の参考になると思う。

465 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 16:20:35 ]
PJの最初の本だと、
例え動的型チェックをやろうとも、そのコードは、
他の普通のコードと一緒でスーパー・コンビネータになって、
グラフ簡約されるだけだから、コンパイル時に型チェックを済ませることが、
スーパー・コンビネータのグラフ簡約上、特に有利だとは思えません。

466 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 17:39:55 ]
横から口はさんですまんが、静的型がついていたほうがパターンマッチが速くならね?

467 名前:デフォルトの名無しさん [2008/08/13(水) 09:02:33 ]
Haskellの継続ってSchemeとは違いありますか?



468 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 10:48:15 ]
call/cc のようなものはありません

469 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 11:17:46 ]
>>468
MonadCont の callCC :: ((a -> m b) -> m a) -> m a のことじゃないの。

>>467
俺も気になる。違いはあるだろうけど、どう違うのか。

470 名前:デフォルトの名無しさん [2008/08/13(水) 11:23:16 ]
やっぱりそうですか。継続ベースのアプリ
作るとしたら、ステートモナドに次のアクション
入れておくとかですかね。

471 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 13:45:50 ]
MonadContだと、型の関係で、無限ループするような式は書けない。
# mfixとか使えば別だけど。

例えば、Schemeで次の式は書けるが、MonadContでは書けない。
(call/cc (lambda (c) c))
(call/cc (lambda (c) (set! foo c)))

つまり、次の式は型が付かない。
callCC (\c -> return c)
callCC (\c -> lift $ put c)

要は、callCCで捉えた継続をそのcallCCの外に出せない。ただし、
callCC (\c -> ... callCC (\c' -> c c') ...)
のように、内部で別のcallCCを使って、それで捉えた継続を外に出すのはOK。

あと、変な例として、
callCC (\c -> return (Right (c . Left)))
はOK。でもやっぱり無限ループはできない。


472 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 14:58:55 ]
>>471
だとすると、smlのcall/ccを使ったco-routineみたいなことはできないということ?

473 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 17:43:19 ]
smlのcall/ccを使ったco-routineは知らないけど、co-routine自体はできる。

import Control.Monad.Cont

foo = callCC (\c0 ->
do
c1 <- callCC c0
c2 <- callCC c1
c2 10
undefined)

bar =
(do
c1 <- foo
c2 <- callCC c1
callCC c2)

main = print $ runCont bar id


474 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 18:18:41 ]
>>471
HaskellでYコンビネータを書くとき型が問題になるけど、
実質的には fix f = let g = f g in g で問題ない。
それと同じように、
loop = callCC (\c -> let g = c g in return g)
とすれば
do { l <- loop; liftIO $ print 0; l }
のように無限ループを書ける。
(これの変数付きループ版が MonadLib にあった。)
(call/cc (lambda (c) c))
がどう使われるのかよく分からないけど、
実質的には同じことになるんじゃないかな?

(call/cc (lambda (c) (set! foo c)))
callCC (\c -> lift $ put c)
は IORef を使うと問題なくできる。
State だと無理だけど、新しく再帰的なデータ型を定義してやれば、
あまり便利では無さそうだけど一応できた。

475 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 22:46:51 ]
オラ本の執筆遅れてます
著者にプレッシャヨロ

476 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/13(水) 22:51:05 ]
どうせ買わないので暖かい目で見守るだけです。

477 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 23:21:14 ]
Schemeのcall/ccってその時点の継続を勝手にキャプチャして渡してくれる
んですよね?Haskellではそういうのは無いと思っていいんでしょうか?



478 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 00:04:58 ]
>>477
モナド無しでということなら無い。
そもそもcall/ccは副作用があるし。

479 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 13:47:21 ]
>>474ができると言ってるじゃないか

480 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 17:35:34 ]
あれはモナド有りでの話だよ。

481 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 18:53:40 ]
ごめん、>>479>>477へのレスね

482 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 18:54:49 ]
山本モナド

483 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 19:35:13 ]
Haskellはボブマリーの言語?
lethain.com/entry/2008/aug/14/global-popularity-of-programming-languages/

484 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 20:24:00 ]
コメント欄も読もうな

485 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 22:50:09 ]
ttp://profile.myspace.com/index.cfm?fuseaction=user.viewprofile&friendid=123319698

こうゆう落ちもある。

486 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 12:30:17 ]
Xmonad/Config archive - HaskellWiki
haskell.org/haskellwiki/Xmonad/Config_archive
の設定ファイル郡を理解できるぐらいまでHaskellについて知りたいんですが
どこから勉強すればいいんでしょう?
知識はXmonadやGhcをソースからインストールできる程度です

487 名前:デフォルトの名無しさん [2008/08/17(日) 13:44:52 ]
>>443 >>446 静的で強い型を持つ言語は、単純な実行時エラーを防ぐので
テストは軽減する。haskellなどはそのことが数学的に証明されているので
プログラマはぬるぽやoutofboundsなどの基本的な間違いにであうことなく、
本質だけを考えることができる。



488 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 14:23:37 ]
パターンマッチに失敗すること多くない?
たとえば「空でないリスト」型が欲しいとき、ぬるぽ的な実行時エラーを防げるの?

489 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 14:47:05 ]
ぬるぽは無いけどout_of_bounds発生させまくりですが
依存型のある言語なら防げるかも知れんけど

490 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 15:31:08 ]
>>487
おまえ初心者スレにいたHaskell信者だろ。

491 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 18:08:12 ]
はいはい両者リングアウト

492 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 18:14:59 ]
>>488
それヘボすぎ

493 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 18:26:58 ]
モナドがIOに使えるのは分かった。けどどうしてそれをIO以外にも使ってるの? >Haskell
誰か教えて下さい

494 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 18:36:20 ]
Maybe(笑)を証明するため

495 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 18:36:41 ]
便利だから

496 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 18:42:38 ]
どんな時に便利ですか?

497 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 18:59:33 ]
モナドのすべて
ttp://www.sampou.org/haskell/a-a-monads/html/
の以下の部分を読むとわかるかも

Maybe というモナド
ひとつの例
リストもモナド



498 名前:497 mailto:sage [2008/08/17(日) 19:11:05 ]
第 II 部:標準的モナドのカタログ
の各モナドの利用場面や動機を見るのもいいかもしれない

499 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 19:15:59 ]
一応リストモナドやMaybeモナドが計算に使える、というのは理解しているつもりですが、
便利だからという理由以外にモナドをIO以外に使う理由はあったりしますか?
それだけの理由で使うには扱いが難しくて、プログラムを組む度に頭がオーバーヒートしそうになる

慣れの問題かそれとも理解不足か・・

500 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 19:25:15 ]
>>489
そこでmaybeもなどですよ。

501 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 20:06:22 ]
モナドという抽象的な枠組みを考えることで
IO, Maybe, List, etcの計算の合成を統一的に扱えるってのが最大の利点なんではないかと。

単に使うだけなら主に慣れの問題だと思う。
いろんな例を見て慣れていけば少しずつ理解もできていくんではないかと。

502 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 20:09:49 ]
自分の作ったモナド上でdo式を書くと、世界の法則を書き換えてるような気分になってちょっと面白い

503 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 20:33:06 ]
>>501
レス有難うです
慣れの他に密度の問題もあるかもしれないと思ったり。
他の言語より1行あたりの密度が濃いものになりやすい気がする。
というか濃縮されすぎてわけが分からなくなりやすい気がする。

504 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 20:38:12 ]
>>501
計算を統一的に扱うだけであれば、普通の型クラスでいいんですよね?

モナドは値ではなくて型コンストラクタに対するクラスなので、ちょっと違う
と思うんですが。

505 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/17(日) 20:39:51 ]
モナドっていうと仰々しいイメージがあるかもしれないけど、
所詮はただの代数的データ型とそのデータ型に対して一貫性あるAPIのセットに過ぎないよ。
ところで、 データ型とAPIのセット のことをなんて呼べばいいの?

506 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 20:40:10 ]
Stateモナドとかの(s -> (a,s))みたいな変な定義が気持ち悪い
型クラス(b,s) -> (a,s)に型bを部分適用したって考えれば意味は通るけど……

507 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 21:08:43 ]
>>505
それが「型クラス」、ではないのでしょうか?MonadやFunctorはちょっと
毛色が違うという認識は勘違いでしょうか?



508 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 21:17:01 ]
www.hyuki.com/haskell/20041228215300

Ord、Eq、Show などの データ型とそのAPIのセット は「型クラス」
Functor、Monad、MonadPlus などの データ型の構築子とそのAPIのセット は「型構築子クラス」

509 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 21:31:22 ]
それ単にOrdとかの『類』は*で引数をとらないけど
Functorの『類』は*->*みたいに引数をとる、って違いにしか見えない
分けて考えるのはおかしいと思う

510 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 21:37:45 ]
>>509
型クラスと型構成子クラスじゃ抽象度が違うよ。

511 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 21:49:13 ]
俺も>>509みたいに感じるなあ
抽象度が違うのは理解できるが

512 名前:507 mailto:sage [2008/08/17(日) 21:58:16 ]
抽象度の違う型クラスを持つことで、値の計算遷移とは別レベルの
遷移を持つことが可能だ、という印象を持つんですけどどうなんでしょうか。

普通の計算を行う裏側で別の次元での計算が行われ、且つそれが
結合法則を満たしている、というのがモナドの定義と考えるのは
どうですか?自分は圏論などのこと全く無知なのでHaskellの構文
からの直感的な印象だけなんですけど。

513 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 21:59:06 ]
じゃあ類が*->*->*(関数(->)とかタプル(,)とか)に対する型クラスとかは
もっと抽象度が違うので別の名前が必要なのか?型構築子構築子クラスとか。
有名な人が書いてるから鵜呑みにしてるだけなんじゃないの?

514 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 22:31:24 ]
>>512
だいたいあってんじゃね?
見えてる部分で適当に処理を書いたら裏で適当に処理してくれる、
普通のプログラミング言語じゃfor文やif文みたいな処理構造、
あるいはマクロとして提供されるものと同等の処理ができるんだけど、
実態は単に型クラスでしかないので俺定義できるし、高階関数使えるし、表記もシンプルで、いろいろ小細工が利くのが利点。
たとえば、IOみたいにコンストラクタを隠したりすれば脱出不可な構造を作れるってわけ。

結合法則を満たしているってのは、まぁ別に特別なことじゃない。
EqやOrdにも反射律とか推移則とか守らないといけないルールがあるけど、
よっぽどのことがない限り変な実装はしないだろうから、一般のプログラミング言語ではそこまで突っ込まない
でもモナドって実態がよくわかんないから、ルールを明記してる。そんだけでしょう。

515 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 22:45:32 ]
念のため補足。
>処理構造(略)同等の処理ができるんだけど
普通の言語では処理構造のものが、モナドが利用されてる例としてはErrorモナドとかContinuationモナドとかがあったね。

>よっぽどのことがない限り変な実装はしないだろうから、一般のプログラミング言語ではそこまで突っ込まない
浮動小数点の比較と等価性で違う実装がされてるとか、変な実装もあるけど。

個人的にはMonad則は、
値に関して順次実行できる何かで、値に対して何もしない処理もできる何かだ、というルールだと解釈してる。

516 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 22:50:03 ]
変な実装=全順序じゃない、と読み替えてくれ。
コンピュータのメモリ節約を考えれば生の浮動小数点型を使うのもまっとうな実装だわw

517 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 23:19:23 ]
ごめん、誤解を招くといやなのでもう一つ補足……
>値に関して順次実行できる何か
これは実行順序じゃなくて値の計算する方向を言ってるだけだよ。
g.f x がxにfを適用してgを適用するってのと同じことだよ。
実行順序は普通のモナドもIOモナドも方向は決まってないよ。



518 名前:初心者修業中 mailto:sage [2008/08/17(日) 23:37:55 ]
ん?
実行順序を明確にするのがIOモナドの目的の一つ
と認識していますが。

そういう意味ではないのかな…

519 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 23:41:24 ]
Haskellをみて日本のhaskellコミュって元気なの?
他の言語に比べて内と外をわけすぎるようなそんな印象をもってる。
なんでだろ?

520 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 23:58:38 ]
>>518
たとえば、
1:2:3:[]は、
1:2:3:[] → 1:2:[3] → 1:[2, 3] → [1, 2, 3]と簡約されるかもしれないし、
1:2:3:[] → [1, 2:3:[]] → [1, 2, 3:[]] → [1, 2, 3]と簡約されるかもしれない。
でも結果は一緒でしょ?

同じように、
Hello, Worldって出力 >> 一文字入力 >>= 前の文字を出力
みたいなのは、まぁ言ってみれば(不正確だけど)
[Hello,Worldって出力, 一文字入力, 前の文字を出力]みたいな並びにされる(と思われる。実装はカプセル化されていて不明)。
この並びがプログラム終了後にコンパイラにわたって、コンパイラがこれを順番に処理していく。

実はこの並びをプログラム終了後以外に評価する方法があって、それがUnsafePerfomedIOって言う関数。
getContentとかは実はこれを使って実装されている。
Unsafeという名前が示すように、素人にはお勧めできない。(getContent自体は普通に使える。)

521 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 00:02:55 ]
Maybeの特化にしか見えません

522 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/18(月) 00:25:49 ]
>>519
世界的に全く元気がありません。
ちょこっと変なライブラリを書いたと思えばそれっきり離れていっている人も多数。

523 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 01:36:55 ]
>>520

後者の簡約は型がおかしいし、1:2:3:[]ではなく、
f x = (unsafePerformIO $ print x) `seq` xで
f 1:f 2:f 3:[]だった場合、前者と後者の簡約順序ではprintの順番が違ってくる。
前者は3,2,1で後者は1,2,3

一方で(>>=)は最左最外簡約でも最右最内簡約でも
左から順にしか値が定まらないようになってる。

putStr "Hello" >>= (\ _ -> getChar) >>= (\ c -> putChar c)
(>>=)の右辺が関数だから左辺の値が定まるまでa >>= bが最終的な値に簡約できないようになっている。

524 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 03:17:18 ]
>>522
元気無い理由って何でしょうか。他に元気ある言語ってあるのかな。

525 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 04:14:24 ]
ruby

526 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 08:38:27 ]
>>520
> 1:2:3:[] → [1, 2:3:[]] → [1, 2, 3:[]] → [1, 2, 3]と簡約されるかもしれない。

型が滅茶苦茶だよ。

> この並びがプログラム終了後にコンパイラにわたって、コンパイラがこれを順番に処理していく。

意味不明。なぜプログラム終了後にコンパイラが出てくる。
ランタイムライブラリとごちゃまぜになているぞ。


527 名前:デフォルトの名無しさん [2008/08/18(月) 10:05:00 ]
Haskellにこういう奴が多い気がするのはなぜだ



528 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 10:21:37 ]
「こういう奴」と書けばどんな奴を指してるのか分かってもらえると思ってるような、
想像力の貧しい奴がこのスレに多いような気がする

529 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 13:36:03 ]
末尾が「気がする」で終わってるレスは
全部気のせいのような気がする

530 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 15:08:49 ]
なんという自己言及レス

531 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 15:12:16 ]
関数型らしくて言いじゃないか

532 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 15:41:06 ]
>>531
つ座布団1枚

533 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 21:50:15 ]
* -> * -> * ってどんなとき使うの?

534 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 22:25:25 ]
アナルトレイン

535 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 07:45:46 ]
  ( ゚д゚)゚д゚)゚д゚)
  /  つ つ  つ
  (_(_  ノ ノ  ノ
  し∪ ∪ ∪

536 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 10:10:53 ]
>>505
> ところで、 データ型とAPIのセット のことをなんて呼べばいいの?

プログラミング言語一般での話なら「抽象データ型」でしょうね。

537 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 11:50:46 ]
>>533
関数(->)とかタプル(,)とか



538 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 20:24:46 ]
485でおま。
それでなのです。 >ときどきの雑記帖の中の人

539 名前:デフォルトの名無しさん mailto:sage [2008/08/21(木) 14:40:13 ]
Arrow は * -> * -> * のクラス
MonadTrans は (* -> *) -> * -> * のクラス

540 名前:デフォルトの名無しさん mailto:sage [2008/08/21(木) 21:20:37 ]
book.realworldhaskell.org/beta/

これの30章が消えてるんだけど・・・。

541 名前:デフォルトの名無しさん mailto:sage [2008/08/21(木) 22:05:29 ]
本買えよ

542 名前:デフォルトの名無しさん mailto:sage [2008/08/21(木) 23:26:23 ]
30章だけが読みたいんだよ。

ところで、HaskellでPetStoreってあるの?

543 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/21(木) 23:56:58 ]
>>542
横からすみませんが、
Pet Storeをよく知らないのでちょこっと検索したんですが、
これっていったい何が面白いんですか?

544 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 00:08:29 ]
>>543
面白くは無いんだけど、色んな言語やフレームワークで同じもの作る
ことで比較をするためのものでしょ。同じアプリがこんな感じで作れ
ちゃうぞ、という。


545 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 11:40:45 ]
Haskellでウェブアプリというとふつう本か

546 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/22(金) 12:37:40 ]
最近では新しい言語はWEBアプリが書きやすくないと人が入ってこないらしく、
ライトウェイト言語がブームみたいだね。
HaskellはライトウェイトではないからWEBアプリ向きとは全然思えないんだけど、
RubyでRubyOnRailsが考えられたみたいにHaskell独自のWEB向きキラーアプリが
出てこないとHaskellの人気はこれからもずっと平行線だと思うよ。

547 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 12:41:19 ]
>>546
WEBアプリが書きやすいっていうより、APIとかWEBコンテナが標準装備されてないとダメという感じがする。
Javaの功罪は大きい。



548 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 12:41:59 ]
まだ横ばいならたいしたもんだ

549 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 12:48:26 ]
>HaskellはライトウェイトではないからWEBアプリ向きとは全然思えないんだけど、
ライトウェイトって何?動的に型を付ければライトウェイト?
それとwebとどういう関係があるの?

550 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 13:05:36 ]
あまり考えずに気の向くままに書いてもあっさり動くのが
ライトウェイトってことじゃないか?
web案件は短期だったりアジャイルだったりでライトウェイトに
開発できるのが求められてるってのはある

551 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 13:10:45 ]
WEBアプリの開発者は、JavaかRubyのHowto本から入ってる。
だから、WEBアプリ開発者は、身体のどこかに、プログラミング言語のJavaかRubyに似てない部分に拒否反応を持ってる。

552 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 13:11:10 ]
ここでHaskellは人間の思考過程に最も近いから
考えが即座にコードにうつせるため開発期間が最短であると主張する人がどこからか登場
                    ↓

553 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 13:23:23 ]
                    |
                ( ゚д゚ )↓
                 (⊃⌒*⌒⊂)
                  /__ノ''''ヽ__)

554 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 13:27:58 ]
>>550
それならHaskellもライトウェイトで良くね?

555 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 14:05:36 ]
明示的なコンパイル作業が必要ないってのはLLの必要条件な気がする。

556 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 14:18:04 ]
LLとかWebアプリとか、
だから普及しないとか、
どうでもよくねえ?
好きな事、楽しい事すればいい。

557 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 14:22:47 ]
>>555
runghcがあるじゃないか
もうちょっと速ければと思うことはあるけど



558 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 14:34:05 ]
>>556
そういう立場も理解できるけど、俺は普及してほしい
ライブラリのメンテとか人が足りてないじゃん

559 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 14:46:33 ]
>>552
Prologには負けるんじゃない。

560 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/22(金) 14:47:15 ]
runghcはオーバーヘッドもかなり大きいみたいだね。

$ cat hello.hs
main = putStrLn "hello"
$ time runghc6 hello.hs
hello

real 0m0.835s
user 0m0.780s
sys 0m0.052s

$ cat hello.rb
print "hello\n"

$ time ruby hello.rb
hello

real 0m0.015s
user 0m0.012s
sys 0m0.000s

561 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/22(金) 14:48:14 ]
$ cat hello.pl
print "hello\n"

$ time perl hello.pl
hello

real 0m0.007s
user 0m0.004s
sys 0m0.000s

$ cat hello.py
print "hello"

$ time python hello.py
hello

real 0m0.035s
user 0m0.020s
sys 0m0.016s


562 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 15:03:43 ]
LLでHaskell関係のプレゼンとかしてる人いるみたいだけど?

563 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 15:07:56 ]
WebアプリとLL(と呼ばれている言語)との間には全く関係はないけど、
Webアプリのかなり大部分は一般的にLLと呼ばれている言語で書かれているだろう。
そういう"LL"はテキスト処理がしやすいからってのがあるだろうな。
まあHaskellがそういう意味で人気にならなくても別にどうでもいいけど。

ここでmondic Parser Combinatorを持つHaskellが
最もテキスト処理に適した言語であると主張する人がどこからか登場。
                    ↓

564 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 15:38:43 ]
HaskellもLL言語だよ

565 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 15:45:06 ]
これどうなの?
ttp://happs.org/

566 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 16:09:31 ]
Parser Combinatorがあるからテキスト処理ならHaskell最強だろ。







満足した?

567 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 17:42:48 ]
haskellは型推論がちゃんと効いてる使い方が出来れば、LL的な生産性は確保できるだろう。
だがな、至高の存在で良いじゃないか。

haskellの性質上webプログラミングは不得意分野に思うんだが、mod haskellなんて生まれる
分けでもないし生まれたところで破壊的操作がほとんどできないし、ファイル操作は基本的に
苦手でしょ。webは動的言語の親玉が一番向いてるけどs式アレルギーな人が多いからLLに
なってるんでしょうね。

だから、無理にwebに擦り寄らずとも良いと思うんだけどね。むしろ、破壊的操作より安全性を
大切にされる金融などのところで目立つ存在になってくれたらいいんじゃないか?




568 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/22(金) 18:09:07 ]
>>567
もし金融などで使われることを想定するなら、
haskellの並列処理に関する部分も早く実装してほしいところですね。
(まだ未完成)

569 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 18:44:00 ]
某氏のhapps解説はお流れ?

>>567
> 破壊的操作がほとんどできない
なんで?

570 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 18:58:34 ]
なんでそんなにHaskellの応用分野を限定したがるんだw

>>567
コンパイルするならmod_haskellがあっても恩恵は小さいだろ
>破壊的操作がほとんどできないし
Haskellで入出力書いたことあるか?
>ファイル操作は基本的に苦手
これも良く分からん
flock使うのにわざわざライブラリを落としてこないといけないとか、そういうこと?

571 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 19:43:28 ]
ウイルス対策ソフトのように危機感を煽るのはいいが、
既存のシステムを補強するのではなく全部作り直せというのは、ちょっとね

572 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 19:54:17 ]
>>570
Prologを事務処理に使うと、住所や氏名情報などで爆発的にアトムが
発生し、Heap領域を埋め尽くして、GCが頻発するという事態となる。
もちろん数百万レコードを越える処理単位の話だが。
Haskellの場合この問題は起きないの?

573 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 20:37:03 ]
Webアプリが苦手ってことは無いと思うんだけどな。今後Webベースのアプリは
まだ増殖するだろうから、そっちで使いやすいフレームワークやDSLが出ないと
使う人は頭打ちだと俺も思う。

研究者の論文レベルのものも面白いだろうけど、上から下までHaskellベースで
かかれたWebアプリとかで目立つものが出てほしいよ、個人的には。

574 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 20:53:32 ]
>>572
アトムの爆発ってのはPrologスレで言及されてる現象のことでいい?
そもそもPrologのアトムってのが良く分からんので何が問題なのか理解できん
Lispのシンボルみたいな物と思っていいのかな
それなら相当するものはHaskellにはないよ

575 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 21:35:41 ]
>>574
Lispのシンボルみたいな物、ですね。
記号をどう処理しているのですか。

576 名前:デフォルトの名無しさん [2008/08/22(金) 21:53:05 ]
>>540
30章ってなんの章だったの?

577 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 22:12:26 ]
>>575
「記号」と言われてもいまいちピンと来ないんだが、何にせよ、
普通の手続き型言語が「記号」を処理するのと大差ない方法で処理してると思う

取り得る種類がコンパイル時に決まっているなら列挙型
そうでないなら整数とか文字列
文字列の比較のコストが問題になるなら自分でシンボルテーブルのようなものを用意する、とか



578 名前:デフォルトの名無しさん mailto:sage [2008/08/22(金) 22:34:03 ]
>>576
>>310-314

579 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 09:45:26 ]
>>572
Prologでも、
1レコード512バイトをsub_atomで30項目に分解したり、更にsplitの
処理をしたりすると確かにアトムが大量発生するだろうが、
Stringとして読み込んで、終始String処理に徹すれば、アルファベットの
数、つまり高々数万のアトムで済むんじゃないの?
Stringすなわちリスト処理になると遅いから嫌なのかな。


580 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 10:00:27 ]
宣言的言語をリアルタイム処理に使いたくない病にかかってる。
資源が十分にあると理屈では分かっていても、終わったら電源切っても大丈夫な処理じゃないと拒否反応がでる。

581 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 10:09:14 ]
>>579
処理速度もあるかも知れませんが、アトムだと、
foo([株式会社|R],R).
と書けるところが、Stringだと
foo(List,R) :- append("株式会社",R,List).
と書かなくてはならないということがあります。
appendを高速化する機構が欲しくなりますね。


582 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 10:35:10 ]
それって代数的データ型を使ってこんな感じで良いんじゃない?

data Atom = Kabushiki | Dummy deriving (Show, Eq)

foo :: [Atom] -> [Atom]
foo (Kabushiki : r) = r


583 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 11:43:27 ]
Prologでまったり Part3
pc11.2ch.net/test/read.cgi/tech/1193354806/

584 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 12:43:04 ]
>>581
この話おかしいよ。
foo([株式会社|R],R). の方は、
すでに株式会社というアトムが切り出されていて、リストの構成要素になっている。
一方、
foo(List,R) :- append("株式会社",R,List). のListはString。ここは、
foo(["株式会社"|R],R).
でなきゃ、フェアじゃない。


585 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 13:58:45 ]
>>572
> Prologを事務処理に使うと、住所や氏名情報などで爆発的にアトムが発生し

第五世代コンピュータプロジェクトの成果を是非参照下さい。

586 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/23(土) 14:16:16 ]
>>585
よく知らないけどソフトウェア科学会会誌7月号に第五の話題が載っていたよ

587 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 14:21:10 ]
成果って、「prologって役立たずじゃん」という結論を得たこと?



588 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/23(土) 14:28:53 ]
>>587
それは短絡的な人たちの根拠のないうわさ。
第五は基礎研究なので企業の人たちが求めるような成果が出ないのは当たり前のこと。

589 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 14:31:33 ]
Prologの話は他でやってくれ
んで問題点を整理してまたいらっしゃい

590 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/23(土) 14:33:31 ]
詳しいことは忘れたけど、
述語論理による仕様記述を使った鉄道のプロジェクトが企業側で行われた例があったような。
なんだったっけ?

591 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 14:45:22 ]
Prologはどうでもいいのだが、Haskellで金融(とくに保険業)のアブリを
開発する場合、何か問題になる点はないのか。

592 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 14:54:20 ]
>>591
必要なメモリサイズを予測しにくい点とか。full lazyな処理系全般に言えると思うけど。

593 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 14:57:02 ]
金融系システムにHaskellを使うメリット自体が思いうかばん。
いいじゃん、Javaでつくるのが流行ならJavaで作らせれば。
どうせ枯れたシステムなんだから。

594 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 15:00:18 ]
>>592
full lazyな処理系って、よくわからない。

595 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/23(土) 15:11:43 ]
どんな言語で書いたとしても、必要なメモリの量は実際に動かしてみないとわからないよ。

596 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 15:17:46 ]
haskellっていいプロファイラあんの?

597 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 15:26:42 ]
>>595
COBOLなんかは確定してると思うけど。



598 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 15:42:16 ]
>>597
してない。
SORTなどに内部的に使う記憶容量が不明。

599 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 15:43:11 ]
Haskellのようにデフォルトで遅延評価する言語は、
計算をできるかぎり遅延させようとするから、
下手な書き方するとすぐメモリリークする

Haskellのメモリリークは大抵の場合小規模な修正で直るけど、
どこを修正すべきか探すのに慣れとプロファイラが要る

>>596
GHC付属のプロファイラは優秀だと思う

600 名前:36 ◆K0BqlCB3.k mailto:sage [2008/08/23(土) 15:47:59 ]
>>596
profオプションをつけてコンパイルしたらランタイムシステムにプロファイラが組み込まれるよ。
詳しくはマニュアルで。

601 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 16:19:23 ]
>>598
ん?確定はしてなくても最大どれかけかかるかは確定してるでしょ。
グラフ簡約のヒープ消費は予測もつかんぞ。

602 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 16:27:11 ]
>>601
確定してるのかしてないのかどっちだw

603 名前:初心者修業中 mailto:sage [2008/08/23(土) 16:37:52 ]
Haskellでメモリーリークが起きるのですか?

ガベージコレクションにバグがない限り、
メモリーリークが起きるとは思えないのですが…。

FFIを使った場合の事でしょうか…。

604 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 17:15:44 ]
>>599 の例としては↓の話かな。
d.hatena.ne.jp/desumasu/20060909/1157800884

この場合のメモリーリークは単なるメモリの解放忘れって事ではなくて、
期待した解放タイミングと実際のそれとのギャップの事みたいだね。

605 名前:初心者修業中 mailto:sage [2008/08/23(土) 17:42:49 ]
これも「メモリーリーク」と呼ぶのでしょうか?

*Main> foldr (+) 0 [0..1000000]
*** Exception: stack overflow


606 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 18:05:58 ]
プログラマが意図してないで、リファレンスが残るようなコーディングを
しちゃってる、というのをリークに含めることもある。

607 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 18:34:57 ]
>>605
それは「マヌケ」と呼びます。



608 名前:初心者修業中 mailto:sage [2008/08/23(土) 18:57:56 ]
stack overflowが発生する時、

簡単にわかる場合は「マヌケ」
ちょっとわかりづらい場合は「メモリーリーク」

と呼ぶという認識でよろしいでしょうか?

609 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 19:14:20 ]
リークってのは「漏れ」のこと。
GCのある言語だと、>>606しか起こり得ない。
>>605の「溢れ」とは全然違う。

610 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 19:20:46 ]
>>605
それはスタックオーバフロの例外であって、エラーとは違う。
メモリリークしているわけではないよ。

611 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 19:22:12 ]
C言語みたいに型があいまいな言語ではメモリリークが起こりうるが、
Haskellみたいに強い静的型付けされている言語にはメモリリークなんてありえないよー

612 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 19:26:56 ]
スタックオーバーフローとメモリーリークは
現象として全然違うと言う事ですね。
分かります。

613 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 19:53:14 ]
>599や>604が挙げているような例はC言語で
良く言われる「メモリーリーク」とは違う現象だな。

Haskellの場合、遅延評価がデフォーなので
うかつに再帰を使うと計算の途中結果が膨大な
ものになってヒープ領域が溢れてしまう。

Cの場合はただの確保したメモリの解放し忘れ。
Cでも再帰的なメモリー確保をすれば
Haskellみたいな事も起きうるはずだが。

614 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 20:06:48 ]
>>611
強い静的型付けとメモリーリークの有無はほとんど関係がありません。
GCの方がずっと関係が深いです。


615 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 20:09:24 ]
Pascalのnewとfreeだっけ?
あれ考えれば分かるよな。
強い型付けでも簡単にメモリーリークは起きる。

616 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 20:56:45 ]
foldl でも stack overflow するんだよね。
Data.List.foldl' 使えばいいんだけど。

617 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 21:35:43 ]
なんで foldl でスタック溢れるの?末尾再帰が最適化されてないの?



618 名前:デフォルトの名無しさん mailto:sage [2008/08/23(土) 21:48:31 ]
>>604のリンク先に書いてある
末尾再帰は最適化されるよ

619 名前:初心者修業中 mailto:sage [2008/08/23(土) 23:53:01 ]
>>617
遅延評価だからと認識しています。
↓参考
haskell.g.hatena.ne.jp/jmk/20060710/1152516465

620 名前:617 mailto:sage [2008/08/24(日) 00:40:37 ]
>>618-619
なるほど、非常によくわかりました。
(つーか前出のリンク読まずにレスして申し訳ない)

うーむ、しかし末尾再帰が最適化されることの旨みは、
・ローカルスコープの値をスタックに積む必要がなくなることと
・連続するreturnが省略されること
の2点だと思うけど、foldl のように結局は遅延評価のための
computation がスタックに積まれていて、後から順次簡約するなら
「最適化されている」とは言い難い気もするな・・・。
最適化するための然るべき変形は、一応してあるんだろうけど。

まあ seq 使うとか、回避の仕方がないわけじゃないからいいのかな?

621 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 00:54:46 ]
↓にも関連した話が載ってる。
itpro.nikkeibp.co.jp/article/COLUMN/20070403/267180/?P=2

622 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 13:10:00 ]
■■学校を作ろう!■■
VIP発でサイトを作ろうと思うんだ。(詳しくはWikiを見てくれ)
パートスレになるんでパー速(GEP)に移動している。
今スタッフを募集しているから、来てくれないか?

■Wiki
www36.atwiki.jp/vipvipschool/
■募集スタッフ
プログラム担当(特にErlang、Perl)
デザイナー(サイト上のアイコン、ロゴなど)
WEBデザイナー(サイトデザイン案に沿って、htmlやCSSを書ける)
他にも宣伝担当なども募集している。
■スレ
ex14.vip2ch.com/test/read.cgi/news4gep/1219068297/

623 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 16:41:26 ]
「特にErlang」…

実用性でいうとやっぱErlangなのかな…

624 名前:デフォルトの名無しさん mailto:sage [2008/08/24(日) 18:20:21 ]
>623
大規模なWebサービスを構築するのに向いていると
考えたから企画者がErlangを採用したんだろうね。

625 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 09:10:25 ]
大規模な、ってのがクセ者で、
実情は単にDBのテーブルが大きいだけだったりするよな。
そもそもウェブアプリでDB以外どこが肥大化するよ?

626 名前:デフォルトの名無しさん [2008/08/25(月) 09:11:28 ]
画面?

627 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 09:20:29 ]
>>625
複数のwebサービスから情報集めたり、もしくはhttp以外のプロトコルで通信して情報を取得しなきゃいけなかったり、
別プロセスで並列キューに入れて処理しなきゃいけなかったり、システムそのものが大きくなるとこはあると思う。
それともデータサイズの規模に限定した話?



628 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 09:53:32 ]
>>625
とりあえずErlang + YAWSの事例くらいは、
念頭においてくれないと、話にならないのでは?

629 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 09:55:11 ]
>>627
> 複数のwebサービスから情報集めたり、

そういうのはAjaxでクライアント側がやるのが流行では?
まあサーバ側がやってもいいですが、HTTPセッションを入れ子にするのは
あまり筋がいい設計とは思えません。

> もしくはhttp以外のプロトコルで通信して情報を取得しなきゃいけなかったり、

まあDB接続なんかもそうですよね。
しかし「大規模になる」ような要因とはあまり考えられないのですが。

> 別プロセスで並列キューに入れて処理しなきゃいけなかったり、

fastcgiとかの話でしょうか?特段、だから大規模になるというものではないと思いますが。

> それともデータサイズの規模に限定した話?

コード自体はほとんどCMS系フレームワークをユーザ定義コンテナを定義する程度で
用が済むことが多いと思います。特に、>>622のような、いかにもCMSっぽいシステムでは。

630 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 10:00:08 ]
>>629
> コード自体はほとんどCMS系フレームワークをユーザ定義コンテナを定義する程度で
> 用が済むことが多いと思います。特に、>>622のような、いかにもCMSっぽいシステムでは。

よいCMS系フレームワークを、
容易に開発できるかどうかって話をしているんだと思いますよ。

631 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 10:54:21 ]
>>630
なるほど、わかりました。
格納するコンテンツの量は結局DBのサイズの問題になると思うので、
それ以外の「大規模」の要因というと、
・同時接続数(パフォーマンス)
・登録ユーザー数
ぐらいでしょうか。
それとも単純にコードサイズを指して「大規模」という話なんでしょうかね。
「学校」というドメインが明確になっているので、
一般のCMSフレームワークほど汎用化は要求されないし、
どのような要因でコードサイズが「大規模」化するのか興味があります。

632 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 12:22:00 ]
>>624
Apacheとか使わずErlangでサーバー構築するんじゃないの?

633 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 12:26:39 ]
キッチンシンクアプローチか……

634 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 13:01:50 ]
Erlangをわざわざ使うということは、数百レベルの並列プロセスを
マルチコアで何とかしようと考えていると見て間違いない。
Webだとすれば、WebServer以外考え難い。生徒数千でほぼ
同時にアクセスがあるとか。

635 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 13:13:15 ]
しかし、>>622 はなんでErlangスレに書いてないんだ?w


636 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 13:16:41 ]
単に初期メンバーにErlang使いが居ただけなじゃいの?

637 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 13:16:52 ]
Erlangスレ見たことない方ですねw



638 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 13:42:02 ]
Erlangはどうでもいいんだけれど、
HaskellでもPerl使いを確保しておいて、単体の機能は専らCPANから取り出させて、
確保されているインターフェイスを介してHaskellで利用するというやり方は
多くなるんじゃないかな。短時間で開発する一手法としてね。

639 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 13:57:49 ]
ならないね。

640 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 14:13:29 ]
>>638 落日のPerlを使うかどうか。 規格書の通りに一からすべて開発するのは確かに大変だね。

641 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 00:21:14 ]
Text/ParserCombinators/ReadP.hsとKoen Claessen氏のペーパーを読んで思ったんですが、

Haskellに慣れてくるとこの実装が直感的に見えてくるんですか?
Haskellのパーサコンビネータ関連のペーパーを読んでいない状態でReadPを読んで、

data P a = Get (Char -> P a)  
      略
      | Result a (P a)
      略                  なのを「え、一番直感的じゃん」

とか、
newtype ReadP a = R (forall b . (a -> P b) -> P b)

instance Monad ReadP where
  return x   = R (\k -> k x)                    ← これとか
  fail _      = R (\_ -> Fail)
  R m >>= f  = R (\k -> m (\a -> let R m' = f a in m' k))  ← これとか
とか
get = R Get
ってなるを、「ああ、自明だなすげえ直感的」みたいに理解できるようになる物なんですかね。。難しすぎる。。。


642 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 00:29:58 ]
>>629
大規模になる要因なんていくらでもあるじゃん。
今時は単にUIがWebで、バックエンドが複雑化してるものも少なくないしね。
分散業務システムで多種類のプロセスを相手にすりゃ自然と規模は大きくなるかと。
何でもかんでもインターネット上でパブリックに利用可能な整理されたサービスばかりじゃないからね。
学校だって企業並みにシステムが複雑化してるとこもあるから、強ち単純とは言えないんじゃないかと。
まあ何はともあれ、ロジックが複雑になればなるほど、関数型の恩恵は大きくなるわな。

643 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 01:08:51 ]
といったって、googleも複雑なシステムとか言われてるけど、
googleを支える技術とか読んでもそんなに複雑とは思えないんだよなぁ。
台数は1台だけど自宅で似たようなことやってるもん。

644 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 08:11:38 ]
>>641
P のような再帰的な型のモナドを、
効率のために継続モナド(ReadP)で包むのは定石。
Haskell への慣れっていうより、
モナドや継続モナドへの慣れの問題な気がする。

P は問題によって様々だけど、
ReadP のとこは Control.Monad.Cont の
一般的な継続モナドと(型を除いて)同じなので、
それを理解しておくと問題に集中できていいかもよ。

645 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 08:13:32 ]
つ チラシの裏

646 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 08:21:08 ]
>>642
それはバックエンドで動いている他プロセスが複雑なのであって
ウェブアプリが複雑なわけではないのでは?

647 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 08:32:48 ]
>>625
機械翻訳とかではなくて?



648 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 18:38:57 ]
>>644
どうもレスありがとうございました。

>P のような再帰的な型のモナドを、
>効率のために継続モナド(ReadP)で包むのは定石。
これは初めて聞きました。どうもありがとうございます。

確かに
If we want to build monads on top of a continuation based programming paradigm,
such as stream processors or continuation based I/O in Haskell,
we need to build a monad around the continuation based operations.
って書いてあるペーパーを見付けました、その継続ベースの方法について考えながら考えていこうと思います。



649 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 18:52:43 ]
www.cs.chalmers.se/~augustss/AFP/monads.html でしょ

650 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 19:00:04 ]
>>649
そうです、でもこれだけ読んでもこれで何がしたいのか俺には正直よく分かりませんな。。
例がなくても理論だけ聞けば全て分かるタイプの人なら大丈夫なのかもしれませんが。

651 名前:デフォルトの名無しさん mailto:sage [2008/08/28(木) 06:47:20 ]
>>648
P みたいなのを継続ベースともいうけど、
ReadP を使うのは純粋に効率のためで、
そこに書いてあるのとは話が違うような。

652 名前:デフォルトの名無しさん mailto:sage [2008/08/28(木) 11:12:38 ]
> 純粋に効率のためで

そう単純化されても…

653 名前:デフォルトの名無しさん mailto:sage [2008/08/28(木) 14:48:42 ]
いや、単純だし…

654 名前:デフォルトの名無しさん mailto:sage [2008/08/28(木) 21:41:23 ]
具体的にどういう場合にどうして効率が良くなるんですか?
ReadPだと、PがReadPで包まれてるわけだけど、

get' = Get return
look' = Look return
sat' p = do a <- get' ; if p a then return a else Fail
char' c = sat' (c == )
string' s = do str <- look' ; scan s str
   where scan [] _ = return s
       scan (x:xs) (y:ys) | x == y = do get' ; scan xs ys
       scan _ _ = Fail
みたいにReadPでくるまないバージョンも用意できて、それもrunで使える。
www.cs.chalmers.se/Cs/Grundutb/Kurser/afp/2006/Papers/parser-claessen.pdf
ここにも効率がって書いてあるけどどんな場合なのかさっぱりだ。。

655 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 14:13:46 ]
ReadPはdata宣言じゃなくてnewtype宣言だから、
記述上は包まれた形になってるけど、実装では包みが外れた形になる。

参照: haskell.g.hatena.ne.jp/jmk/20061203/1165141002

Pは直接的にはうまく束ねることができないから、一旦仮想的なReadPで束ねてるって感じ?

656 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 15:53:54 ]
>>655
どうもありがとうございます。

実際にはReadPの所はR Get やR Lookなどが渡されることになりますよね。
そのあとすぐにrunで即Rはずしてますし。

>Pは直接的にはうまく束ねることができないから
これってどういう意味で仰ったんですか?
P を束ねてパーサとして使うことも、実際できる(>>654のget'など)のでわざわざどうしてReadPにするのか、
Pの>>=が左結合的に作用するのが問題らしいんですけどそれが問題になる具体的なケースについて
私にはサッパリ思い付かなかったので先人たる皆様にお聞きしたかった次第です。


657 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 17:28:28 ]
>>654
ReadP の計算で左結合になってる >>= がある場合でも、
内側の P の >>= をすべて右結合にすることで、
P の >>= の再帰が無くなって効率が良くなる。

9節の第1パラグラフに書いてある通りなんだけど。

左結合を右結合にってのは、>>= の結合則
(m >>= f) >>= g == m >>= (\a -> f a >>= g)
の左辺を右辺にするってな話。
例えば、string s >>= f でも string s の中で
>>= を使ってるので、左結合になってる。
つまりほとんど全ての場合に当てはまる。



658 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 17:29:19 ]
効率が悪くなる事情は、そこにも書いてあるようにリストの ++ と同じ。

リストの ++ は左引数に関して再帰する。
[] ++ ys = ys
(x:xs) ++ ys = x : (xs ++ ys)
そのため (xs ++ ys) ++ zs は xs に関して二重に再帰することになる。
foldr (++) [] (map show [1..10000])
foldl (++) [] (map show [1..10000])
実際これらを実行してみると前者はすぐ終わるけど、後者は "1" を10000回結合、
"2" を9999回結合、... "10000" を1回結合、みたいになって遅い。加速してくけど。
遅いだけじゃなく、中間リストを生成するので無駄にメモリを使うことにもなる。
foldl は極端な例だけど、foldr も極端で、いつも無駄が無いようにはいかない。

659 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 17:30:18 ]
で、回避策。

xs ++ ys は、xs の最後の [] を ys に置き換える。
それを効率よくやるには、最初っから [] なんか使わないで、
1:2:3:[] を \nil -> 1:2:3:nil みたいにしとけばいいじゃんという発想。
つまり [a] を [a] -> [a] に、xs を xs ++ に、++ を (.) にする。

こうしておくと、[] を与えてリストに戻すときには、
(.) が右結合になってなくても ++ は右結合になる。
(((xs ++) . (ys ++)) . (zs ++)) []
= ((xs ++) . (ys ++)) (zs ++ [])
= (xs ++) (ys ++ (zs ++ []))
= xs ++ (ys ++ (zs ++ []))

実際 String の ++ を頻繁に使う class Show あたりでは、
できるだけ type ShowS = String -> String を使うことになってる。
shows :: Show a => a -> ShowS を使ってさっきの
foldl (.) id (map shows [1..10000]) []
をやってみると、今度は問題無く速い。

660 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 17:31:29 ]
で、ReadP。

m >>= f (P の >>=)は、m の最後の return a を f a に置き換える。
それを効率よくやるには、最初っから return なんか使わないで、
Get (\c1 -> Get (\c2 -> return [c1,c2])) を
\k -> Get (\c1 -> Get (\c2 -> k [c1,c2])) みたいにしとけばいいじゃんという発想。
つまり P a を forall b. (a -> P b) -> P b に、
m を m >>= に、>>= を \m f k -> m (\a -> f a k) にする。

以下略。

661 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 17:32:22 ]
で、余談。

foldr c n xs は、xs の : を c に、[] を n に置き換える。
それを効率よくやるには、最初っから : や [] なんか使わないで、
1:2:3:[] を \c n -> 1 `c` 2 `c` 3 `c` n みたいにしとけばいいじゃんという発想。
つまり [a] を forall b. (a -> b -> b) -> b -> b にする。
リストに戻すときは build xs = xs (:) [] を使う。
すると foldr c n (build xs) ==> xs c n と変換できる。

map f xs <==> build (\c n -> foldr (c . f) n xs)
例えばこういう変換を定義すれば、
(map f . map g) xs = map f (map g xs)
==> build (\c n -> foldr (c . f) n (build (\c n -> foldr (c . g) n xs)))
==> build (\c n -> (\c n -> foldr (c . g) n xs) (c . f) n)
==> build (\c n -> foldr (c . f . g) n xs)
==> map (f . g) xs
のように map f . map g ==> map (f . g) という変換ができる。
map f . map g 以外にも、他のいろいろなリスト関数の
foldr/build を使った形への変換を定義しておけば、いろいろな変換ができる。
foldr/build による融合変換ってやつ。今の GHC もこれを使ってる。
詳しくは GHC User's Guide の 8.13. Rewrite rules あたりを見てくれ。

662 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 18:19:15 ]
>>657-661
とても分かりやすい解説どうもありがとうございます!
ちょっと解決の糸口がつかめた感じがします、これからじっくり考えてみたいと思います。
とてもご丁寧にありがとうございました。

流石だ。。。

663 名前:デフォルトの名無しさん mailto:sage [2008/08/30(土) 18:34:32 ]
Haskellが宣言型言語とか最初に言い出したのは誰なのかしら

664 名前:デフォルトの名無しさん mailto:sage [2008/08/30(土) 18:44:45 ]
imperative language ←→ declarative language の対比で
ごく自然発生的なものだと思うが?

665 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 00:07:29 ]
宣言型言語 = what(何をしたいか)を記述
手続き型言語 = how(どうやるか)を記述

クロージャをいかに早めに潰すかに苦心するHaskellは後者ですな

666 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 00:38:36 ]
>>665
宣言型言語=述語論理を記述

と思ったらHaskellも述語論理の仕様記述言語に非常に近い特徴を持っていることに気づく。

667 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 03:38:00 ]
>>665
> クロージャをいかに早めに潰すかに苦心
ってどういうこと?



668 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 09:45:13 ]
>>667
関数のインライン展開のようなものじゃないか
よく分からんが
関数リテラルなら展開しやすいが高階関数の戻り値のクロージャは展開しにくい気がする
だからどう書くか (how) を工夫する

人間が問題を「宣言」するだけでコンパイラが問題を解いてくれる
というのは
素朴な解決策は簡単に見つかるのだが最適化が難しい (が機械的にできる) 問題に限定されるはず

669 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 15:47:12 ]
計算資源が有限なため、howが分からないとwhatも記述できないという罠

670 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 15:59:09 ]
本質的には what -> how の書き換えと how -> how の最適化は似たようなもんだからな。
最適化は手続き型でもやってるから、非手続き型の人はwhatの部分を強調してみたりC/C++より速くなると言ってみたり。

LLの人は最適化にあまり拘らないし、テストさえ通ればhowを直接書いてもいいやって感じだけど。

671 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 17:18:22 ]
>>667
>>600前後の流れ参照
要するに未評価の式(これはクロージャで実装されてる)を溜め込まないように注意する必要がある

672 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 20:51:42 ]
しかし、そんなこと言ってたらprologだって宣言型と言えなくなるんじゃない?


673 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 21:42:38 ]
お前らは
人間の性格はA型B型O型AB型の4種類に分けることができる
とか思ってそうだよな。

674 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 23:36:24 ]
なんでも過不足なく分類できると思い込む愚かさ
血液型と性格をろくな検証なしに簡単に結びつけてしまう短絡さ
どっちをさしてるのか紛らわしいので例としては不適

675 名前:デフォルトの名無しさん mailto:sage [2008/09/01(月) 01:06:10 ]
>>674
おもしろおかしい

676 名前:デフォルトの名無しさん [2008/09/01(月) 07:57:32 ]
www.realworldhaskell.org/blog/2008/08/22/our-writing-is-now-complete/
書き終わったって。

677 名前:デフォルトの名無しさん mailto:sage [2008/09/01(月) 15:40:49 ]
zipで(ry



678 名前:デフォルトの名無しさん mailto:sage [2008/09/02(火) 14:15:50 ]
>>666
試しにZあたりの実行系でもつくってみればw

679 名前:デフォルトの名無しさん mailto:sage [2008/09/02(火) 17:56:25 ]
>>678
何が言いたいのははっきり言え。
小馬鹿にするだけでは情報価値ゼロだぞ。

680 名前:デフォルトの名無しさん mailto:sage [2008/09/03(水) 08:50:51 ]
述語論理なめんな、ってことじゃね?
せめてホーン論理に限定するとかじゃないと話にならんだろ。

681 名前:デフォルトの名無しさん [2008/09/03(水) 23:53:10 ]
関数とKleisli以外のメジャーなArrowってあるの?っていうかArrowって死滅したの?

682 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 00:04:13 ]
>>676
おお!でも英語疲れる。訳書出版の予定はないの?

683 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 01:25:52 ]
>>681
死滅しそうなのはHaskellだが、新しいHaskellのライブラリはほとんどArrowベースだよ。

684 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 11:41:24 ]
このスレって嘘多いよな。

685 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 12:00:02 ]
このスレって〜

ってレス多いよな。

686 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 15:00:58 ]
そういえば、大学入試のときに大学ランクとタバコの関係に気づかされたなぁ・・・
東大 誰も吸っていない
京大 誰も吸っていない
同志社大 ちらほら
関西大 校舎内で吸っているやつがいる(!!!)

ありえないです、低ランク大・・・
やっぱりランクの低い大学出身のやつは信用できない・・・

687 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 15:19:00 ]
そして増える意味不明なレス



688 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 15:20:04 ]
>>684
素人なのでどの変がうそなのか教えてください

689 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 15:45:52 ]
686みたいな奴がhaskellを使うとはとても思えんのだが、
何しに来てるのかね?

690 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 15:50:35 ]
>>689
Haskellがどういうものだと思っているんですか?

691 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 17:36:25 ]
>>686は今マルチされてるコピペ、スルー推奨です。

692 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 19:33:03 ]
>>690
全角数字を見るといらっとくる人が使う言語

693 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 19:35:16 ]
確かにイラっときた

694 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 21:21:38 ]
>>693
それはカルシウム不足

695 名前:デフォルトの名無しさん [2008/09/06(土) 23:15:53 ]
Haskellで良いコード綺麗なコードというのはどんなコードですかね。

出来るだけ変数使わない方がいいとか、何が何でもポイントフリーにするとか、
あるいはそれ以外でも、何でも。

696 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 23:55:28 ]
>>695
y f = f (y f)

697 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 00:05:33 ]
>>695
haskellでは数学的にきれいなコードが「きれいなコード」と呼ばれます。



698 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 00:12:32 ]
良いコード:
意味のあるところでControl.*を使う
悪いコード:
ポイントフリーのためにControl.ApplicativeやControl.Arrowをimport

699 名前:デフォルトの名無しさん [2008/09/07(日) 00:15:18 ]
っていうか、ポイントフリーってなにがいいの?せっかくパターンマッチがあるのに。

>>687
ライブラリはそうだろうけど、普通のアプリを書くときは?

700 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 00:33:20 ]
単純な場合には無駄に変数が増えず、シンプルに分かりやすくなるから良い。
複雑な場合には無理をしても分かりにくくなるだけだから悪い。
パターンマッチとは使いどころが違う。

701 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 00:34:19 ]
>>699
圧倒的に短く書けるからだよ。
それにポイントフリーだと関数の入出力の流れみたいなのがまっすぐ表せるから、処理の全貌が見通しやすい

702 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 00:41:52 ]
まっすぐだけど、流れが逆じゃん。
というわけで>>>使うのはやっぱダメ?逆なのに脳味噌合わせるべきなの?

703 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 00:46:48 ]
GUIアプリを書くときはどういうのが綺麗なんだ?

704 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 00:59:26 ]
>>702
逆なの? y = f x より x f = y が脳味噌に合ってるの?

705 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 01:11:04 ]
>>704
なんでやねん。
unlines . take 10 . filter (> 10) . map read . lines
より、
lines >>> map read >>> filter (> 10) >>> take 10 >>> unlines
の方が、少なくとも俺は脳に優しく感じる。

で、こう書くと、map read と filter (> 10) を分けてるのが冗長でダサい気もするが、
(filter (> 10).read)みたいにした方が良いのか、かえってこっちの方がダサいのか、
あるいは、(filter (\x -> 10 > read x)) みたいにラムダにすべきなのか、綺麗の勘所が判らんのです。

706 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 01:12:53 ]
>>705
あ、前半がStringに戻してないのはご愛敬と言う事で、よろしく。

707 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 01:32:55 ]
>>705
String に戻さないといけないなら
filter ((10 <) . read) だろう。ラムダでもいいけど。
まあ、その辺はこだわるとこでもないかと。

> なんでやねん。
f (g x) と (f . g) x の向きは関係あるんですよ。
数学でも向き的事情から x^f という記法を使うこともある。



708 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 02:23:43 ]
>>702
左から右だろうが右から左だろうがどっちでも一緒だろ。
俺には違いが分からん。

709 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 02:27:05 ]
>>702
こういう反抗したい年頃のやつが言語を汚くしていくんだろうな。
なんでもないものを指差して「使いにくい」などと言ったり、まるでガキ。

710 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 03:31:39 ]
現代日本では横書き文字は左から右だから、
その方が自然に感じるのは当然と思います。

また、bind演算子が(>>=)で左結合である事を考えても
Haskellを設計した人もその方が自然と感じたのではないでしょうか?

慣れの問題かもしれませんが、
そんなにおかしな意見とは思えません。

711 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 07:34:52 ]
まあ関数合成の向きが右から左なのは>>707の説明の通りだし、Haskellに限らず数学でも同じルールだからな。数学でも気持ち悪いって云う人は結構居るしまあそんなに変わった意見でもあるまい。

712 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 21:48:37 ]
社内コーディング規約でここにスペースを入れろとかそういうのよりは高尚が感じがするかもしれないけれど
所詮バイクシェッド
乱用すれば読みにくいし、パズルみたいにポイントフリーするのは間違ってる
数学的に綺麗綺麗とか、圏論的に自然とかというけれど、誰でも圏論がわかるわけじゃないし。

しかし、いかにポイントフリーで書くか、という事を考えると確かにおもろいよ

713 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 21:56:43 ]
亀だが

>>36
>FPGAとかのHDL記述とかに応用したりしてる人いないの?

Lavaがあるよ。並列性とか関係ないし、回路をそのまま関数で書くだけなんだけど。そしてVerilogより使いやすい、なんてこたーない。HDLよりましだが、副作用を書くのがまわりくどい

www.cs.chalmers.se/Cs/Grundutb/Kurser/svh/tools.html



714 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 22:31:52 ]
s/HDL/VHDL/

715 名前:デフォルトの名無しさん mailto:sage [2008/09/08(月) 21:55:12 ]
>>713
ArrowっぽいHDL作りたいな

716 名前:デフォルトの名無しさん mailto:sage [2008/09/09(火) 18:48:21 ]
Real World Haskell
November 15, 2008

待ち遠しい。

717 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 22:50:22 ]
過度の並列化で複雑化するゲーム開発
コスト削減の鍵は純粋関数型言語らしい
www.watch.impress.co.jp/game/docs/20080911/epic.htm



718 名前:36 ◆K0BqlCB3.k mailto:sage [2008/09/12(金) 22:54:50 ]
>>717
そうだろうね。
俺はずううっと前からそう論文に書いてたけど。
だんだんpi-calculusの人気が出てきたね。

719 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 23:58:55 ]
> Sweeney氏は純粋関数型言語のもつ並列処理安全性に着目しており、
>将来的にゲームプログラミングはそういった処理系に移行していくべきだとした。
>Sweeney氏はそのひな形として言語“Haskel”を挙げているが、
>ゲーム開発のメインストリームたり得る言語はまだ登場しておらず、将来に期待しているという。

なんでHaskellは駄目なんだろう。
ライブラリ含めた開発環境の問題か処理系の最適化の問題か
それとも言語仕様レベルで本質的に向いていないのか。

720 名前:デフォルトの名無しさん [2008/09/13(土) 00:06:19 ]
前者じゃない?

721 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 00:09:07 ]
こんなことでもないと注目せんのだな

722 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 00:48:51 ]
遅延評価に漬かりまくりで、ダメなのでは?
遅延評価って言ってみれば、後ろからの逐次でそ?
無限リスト使えないHaskellってHaskell?

723 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 07:07:42 ]
LazyがいやならSMLやOCAML使えばいいだけ。何が不足よ?

724 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 08:23:12 ]
>>723
前方参照,where構文

725 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 09:32:44 ]
>>724
LETで何が不足よ?

726 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 10:42:16 ]
>>717,>>719からのコンテキストを読んでくれよ。

727 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 18:14:08 ]
質問です

たとえばJavaなどではクラスのインスタンスをオブジェクトと呼びますが、
Haskellの代数的データ型に格納されたデータのことをなんと呼べば良いですか?



728 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 18:21:45 ]
>>727
関数

729 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 19:00:09 ]
>>727
「オブジェクト」に対応する用語は普通は「値」でいいんじゃないか

>Haskellの代数的データ型に格納されたデータ
これどういう意味?
型が代数的データ型であるような値のことならそのまま「代数的データ型の値」
代数的データ型の構築子に渡した値のことなら「フィールドの値」くらいか?

data Point = Pt Int Int

x = Pt 0 3
-- xはPoint型の値
-- xのフィールドの値は0と3

730 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 20:26:27 ]
Haskellのプログラミングスタイルのことはなんて呼べばいいですか?
ストリーム指向?

731 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 20:30:20 ]
関数指向

732 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 23:55:40 ]
Haskell系のShellでオススメってある?

733 名前:36 ◆K0BqlCB3.k mailto:sage [2008/09/17(水) 00:00:30 ]
>>732
シェルって何のこと?
言語とは関係ないと思うけど。
シェルスクリプトのことを言っているの?

734 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:07:44 ]
>>733
HSHみたいなやつ

探してみた奴だとどれも開発止まってて…

735 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:09:07 ]
Haskell風構文のシェルっていくつかあるんだな、ググって初めて知ったわ

736 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:15:11 ]
Haskell系の自然言語でオススメってある?

737 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:22:13 ]
lojbanとか?
自然言語じゃないけど



738 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 15:52:29 ]
Yiとか使ってる人いるの?

739 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 17:56:30 ]
Yi って 彝 ?

740 名前:デフォルトの名無しさん [2008/09/17(水) 18:20:56 ]
ぅぃ?

741 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 18:31:27 ]
haskell.org/haskellwiki/Yi
使ったこと無いなぁ。

742 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 17:29:49 ]
ひょんなことからerlangを勉強し始めたが、構文はともかく、思想としては面白いな。
並行指向プログラミングというのかな?
このパラダイムはオブジェクト指向よりも現実志向のパラダイムのように思う。
Haskellでも並列化がうまくいけばerlangみたいな仕組みを実装できるかもしれない。

# erlangの構文は糞 糞 糞 糞杉

743 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 18:18:31 ]
ぅぃゅ

744 名前:デフォルトの名無しさん [2008/09/19(金) 20:28:25 ]
コンカレントハスケル?

745 名前:デフォルトの名無しさん [2008/09/19(金) 20:34:40 ]
ああ、コンカレントは並行だったか・・・

746 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 11:00:42 ]
>>743
私はProlog屋なので、erlangの構文のクソ部分に敏感でない。
お手数かけて恐縮だが、糞の部分を列挙していただけると有難いのだが。

747 名前:a36 ◆K0BqlCB3.k mailto:sage [2008/09/20(土) 12:04:07 ]
>>742
たぶん、その思想というのはpi-calculusのことかな。



748 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 13:08:03 ]
ここのみんなからするとgtk2hsって綺麗なの?

749 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 13:29:19 ]
Erlangってpi-calculusベースなのか

750 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 13:56:48 ]
>>746
743ではないけど、
receive...endとか、カリー化できないとかではないですか?

751 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 14:52:33 ]
>>723
元記事ではSTMが挙げられてるけど、OCamlだと無くね?

>>749
綺麗って何が?Gtk2Hsを使ったコード?
それならあまり綺麗じゃないんじゃない。
GUIを綺麗に書くためのハイレベルなライブラリは
いろいろあるけど、どれも決定打にはなってないような。

752 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 15:23:34 ]
>>751 >>749 じゃなくて >>748 ?

753 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 15:27:39 ]
>>752
>>748な俺からでもそれはわかる。


754 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 00:46:57 ]
gtk2hsと言えば、
gtk_rc_parse_string相当の関数や、
gtk_widget_modify_cursor(これは新しいからか)相当の関数が見付からなくて諦めたことがあります。。
いや私の検索能力が低いだけだと思うんですが、かなり頑張ってもどうしても見つかりませんでした。。。
皆さんgtkやpango、gdkの関数を捜すときってやっぱり根性ですか?
大抵はキャメルケースにすれば大丈夫ですがそうでない時はかなり困りますよねー。。

755 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 12:17:25 ]
いや、検索能力の問題じゃなくて、実際に無いんじゃない?
Gtk2Hsのソースgrepしてみて無かったら無いような。

756 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 08:20:06 ]
webで読んでるけどreal world haskell凄いヴォリュームだな
一週間やってもまだ終わらん
製本版はもう鈍器レベルだな


757 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 09:55:41 ]
なにか面白いこと書いてあった?



758 名前:a36 ◆K0BqlCB3.k mailto:sage [2008/09/22(月) 15:02:13 ]
これでしょ
book.realworldhaskell.org/read/

759 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 16:29:27 ]
url知らないって意味じゃなくて、自分では読む気が無いってことだよ。

760 名前:a36 ◆K0BqlCB3.k mailto:sage [2008/09/22(月) 16:37:06 ]
ぱっと見た感じでは、名前の通り実際にHaskellで開発する時に「背中に手が届く」本になってる感じ。
たとえばデータベースと通信する方法とか、
GUIを作るときのライブラリとかツールとかの紹介とか、
どちらかというと「Haskell逆引きクイックリファレンス」
みたいな感じだね。
目新しいことは何もないけど、逆引きリファレンスとしてはいろんなライブラリとか紹介されていて便利かな。

761 名前:a36 ◆K0BqlCB3.k mailto:sage [2008/09/22(月) 16:39:11 ]
いろいろサンプルコードも載ってるからわかりやすい。
文章の良よりコードの両方の方が多いから英語が苦手な人でもわかると思う。

762 名前:a36 ◆K0BqlCB3.k mailto:sage [2008/09/22(月) 16:39:49 ]
良 → 量
コードの両方 → コードの量

763 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 11:57:39 ]
Parsec.Tokenをロードすると
ERROR file:{Hugs}\packages\parsec\Text\ParserCombinators\Parsec\Token.hs:64 - Syntax error in data type declaration (unexpected `.')
とでて読み込めないのですがどうしたらいいのでしょうか

764 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 12:09:05 ]
>>763
Hugsを標準モードじゃなくて拡張モードで起動すればいい
hugs -98

765 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 12:51:18 ]
>>764
無事読み込めました。ありがとうございます

766 名前:デフォルトの名無しさん [2008/09/24(水) 15:23:46 ]
do構文で、変数の使用が強制されるのはなんとかならんの?
.とか$とかの気の利いたバージョンない?

767 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 15:27:56 ]
何を言ってるのかよく分からんが >>= とか?



768 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 15:36:59 ]
>>=だけですっきりいけるならdo構文使わないでしょ(ってこともないか?少なくとも俺は)。
do構文でモナドを「外す」ためだけに一時変数がやたら必要になるのがイヤって話。
つまるところ>>=になっちまいそうな気もするけど、
便利な演算子なり特殊なカッコなりで、無駄な変数使わずに何とかならんかなぁ、と。


769 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 16:11:24 ]
なにか具体例見せてくれ

770 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 16:18:02 ]
do式の中で、
  a <- v
  b <- f a
は、aを使わずに
  b <- v >>= f
と書ける

同様に、
  a <- v
  let b = f a
は、
  b <- liftM f v
と書ける

こういう話?
>>=は普通にdo構文の内部で使えるよ
俺はこの場合=<<を使う方が好きだけど

771 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 16:26:30 ]
何を言ってるのか俺もよく分からん。
do ...; a <- m; f a; ...

do ...; f =<< m; ... -- m >>= f でも同じだけど...
とか
do ...; a <- m; let b = f a; ...; g b; ...; h b; ...

do ...; b <- liftM f m; ...; g b; ...; h b; ...
とかすればいいって話じゃなくて?

って書き込もうとしたんだけどその前に新着レス見たら>>770被りすぎ。

772 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 16:44:57 ]
n <- m
a <- n

a <- join m
にするパターンもあるかも。

n <- m
o <- n
a <- o

a <- join (join m)
とか。

773 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 16:48:50 ]
ぱっといい例は書けないけど、例えば単純な例で
do args <- getArgs
cnt <- getContents
now <- getClockTime
return someFunc args cnt now
を、
do return soumeFunc #getArgs #getContents #getClockTime
とかこんな感じに書けないかと。(#が架空のモナド外し演算子とか)


774 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 16:53:15 ]
>>770,771,772
ありがとう。特にjoinは使った事なかった。
俺がアホでした。


775 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 16:56:54 ]
あれ?やっぱ違うや。求めてるのとjoin。いや、それはそれで勉強になったけど。

776 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 17:01:37 ]
というか、liftM3ですね。とりあえず釣って来ます。

777 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 17:21:21 ]
ちなみに、
do args <- getArgs
   cnt <- getContents
   return otherFunc args True cnt
だったら?



778 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 17:27:31 ]
>>773みたいな構文は俺も欲しい
このスレで前に同じことを書いた記憶がある
Template Haskellを使えばなんとかなるかな

>>777
liftM3 otherFunc getArgs (return True) getContents
不恰好だけど

779 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 18:03:09 ]
>>773 は Control.Applicative を使って
soumeFunc <$> getArgs <*> getContents <*> getClockTime

return sumFunc <*> getArgs <*> getContents <*> getClockTime
って書ける。infixl 4 # ; (#)=(<*>) とすればあのままいける。
っていうのは
(return soumeFunc) #getArgs #getContents #getClockTime
じゃなくて
return (soumeFunc #getArgs #getContents #getClockTime)
のつもりだろうから嘘だけど。

ただ、IO は Applicative のインスタンスになってるけど、
一般のモナドは WrappedMonad って型が用意されてるだけなので、ちょっと面倒。
でも Control.Monad に <*> と同じ意味の ap ってのがあってこれはどのモナドにも使える。
<$> とかの Control.Applicative にあるいろいろな関数がないけど。

あと Control.Applicative には f (a -> b) -> a -> f b な関数が無いけど
それを f *$ x = f <*> pure x とか定義すれば
liftM3 otherFunc getArgs (return True) getContents は
otherFunc <$> getArgs *$ True <*> getContents と書ける。さすがにキモイ。

780 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 18:18:11 ]
おおっ、あるのね。
俺の見る程度の範囲じゃ<*>とかはあんま見ないけど、そういえばapは見るな。
まあ、>>698とか見ると、>>778の書き方が普通は落とし所って所かも知れんけど、調べてみます。

781 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 23:29:43 ]
windows環境でunix 2.3.0.0のインストールに成功した方っていらっしゃいますか?
私の環境では以下のエラーを吐いてbuildに失敗します。

compiling dist\build\System\Posix\DynamicLinker\Module_hsc_make.c failed
command was: C:\ghc\ghc-6.8.3\bin\ghc.exe -c -package base-3.0.2.0 -package directory-1.0.0.1 -Iinclude dist\b
uild\System\Posix\DynamicLinker\Module_hsc_make.c -o dist\build\System\Posix\DynamicLinker\Module_hsc_make.o

どなたか知恵をお貸しください

--unix.cabal
>The package is not supported under Windows (except under Cygwin).
Windowsは基本的に非サポート、
Cygwin環境下はOKという意味だと思ったんですが違いますか?


782 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 23:58:13 ]
長くて貼れなかった部分(すみません)のログを見てみると
cygwinのフォルダにあるheaderファイルの発見に失敗しているようでした。

終電の時間が近いので、検索パスの追加をした所で今日は帰ります

783 名前:デフォルトの名無しさん [2008/09/25(木) 00:01:22 ]
仕事でハスケル使ってんの?

784 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:25:45 ]
言語設計学者の悲願の言語だけど、開発環境はまだ全然整備されていないから、ほぼ0

785 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 03:02:05 ]
学生だろ?

786 名前:デフォルトの名無しさん [2008/09/25(木) 03:18:09 ]
学生のうちから終電まで勉強してんのかよ。
そんなんじゃ社会に出てからもたんぞ。

787 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 03:51:42 ]
Schemeのcondみたいのはどう書くのがよいでしょうか?
case でマッチング無しガードのみにすればとりあえず出来るけど、dummyや_が冗長。
case dummy of
   _ | conditionA -> bar
     | conditionB -> foo
   otherwise -> baz




788 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 04:41:08 ]
そこだけ別函数にしちゃえば良いんじゃ?

789 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 12:37:19 ]
>>786
何という優しさ。

790 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 19:56:07 ]
こういうsyntax sugarが欲しいなあ。

data X = A | B | C | D

case x of
A | B -> 1
C | D -> 2

791 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 19:58:51 ]
確かに欲しい
でも縦線だとガードに見えるから別の記号が要るな

792 名前:781 mailto:sage [2008/09/25(木) 20:53:49 ]
だめでした。
定義されていない型、定義されていない関数のエラーは
HsUnix.hに手を加えてなんとかしましたが(includeするファイルを追記)

↓結果
dist/build/System/Posix/DynamicLinker/Module_hsc_make.o(.text+0x49):Module_hsc_make.c: undefined reference to
`_impure_ptr'
dist/build/System/Posix/DynamicLinker/Module_hsc_make.o(.text+0x8d):Module_hsc_make.c: undefined reference to
`_impure_ptr'
dist/build/System/Posix/DynamicLinker/Module_hsc_make.o(.text+0xb5):Module_hsc_make.c: undefined reference to
`_impure_ptr'
dist/build/System/Posix/DynamicLinker/Module_hsc_make.o(.text+0xe9):Module_hsc_make.c: undefined reference to
`_impure_ptr'
collect2: ld returned 1 exit status
linking dist\build\System\Posix\DynamicLinker\Module_hsc_make.o failed

それはともかく、今夜はwww.haskell.orgに繋がりにくいですね

793 名前:デフォルトの名無しさん mailto:sage [2008/09/26(金) 13:22:23 ]
>>790
そういう、かゆいところに手が届くのは、やっぱりLISP系最強なんだろうか。


794 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 23:03:38 ]
流行に乗ってHaskellを勉強しているのですが、バイナリファイルの扱い方に困ってます。

int numFloat;
int numInt;
float floats[numFloat];
int ints[numInt];

C的な擬似コードで書くとこんな感じのバイナリファイルに対して、
floatsとintsのデータを取ってきて文字列でフォーマット化して表示してみよう、と思っています。

hFile <- openFile filepath ReadMode
cs <- hGetContents hFile

ひとまずこれで[Char]を持ってきて、そこからnumFloatとnumIntを切り出せばよいか、
と思ってるのですが、じゃあそれってどうするんだろう、ってところで詰まってます。

(numFloat,numInt,残り) = hogeFunction cs

みたいな感じで切り出すのが関数型的な感じなのかな、と思っているのですが、
そもそもこの辺の考え方からして駄目っぽいですか?

795 名前:初心者修業中 mailto:sage [2008/10/01(水) 23:29:57 ]
>>794
バイナリモードじゃないとダメなんじゃないでしょうか?
こんなのがありました

ttp://ha6.seikyou.ne.jp/home/yamanose/haskell/wave2.html

796 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 23:38:17 ]
>>795
ありがとうございます。
BinaryModeって付けないと駄目なのと、
あとPtrを経由してデータを取ってくるんですね。

これで勝つる!

797 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 00:03:06 ]
べつにPtrを経由しなくても>>794の方針でいけるよ
効率を気にするなら別だけど



798 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 00:27:22 ]
Ptrを経由しないとバイナリ表現のFloatから
HaskellのFloatを得る手段が難しいよ。
thread.gmane.org/gmane.comp.lang.haskell.cafe/44845/focus=44927

799 名前:初心者修業中 mailto:sage [2008/10/02(木) 00:56:54 ]
>>797
テキストモードの場合、、
control-ZをEOFと認識したり、CRLFを LFに変換すると
GHCのマニュアルにありますが、
問題ないのでしょうか?

800 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 01:06:55 ]
>>799
問題ある
>>797は、バイナリモードで開いた上でgetContentsすればいい、という意味で言った

>>798
確かにそうだな
ちゃんとテストしてないけど一応こんなんでいけるみたいだ

import Data.Bits
import Data.Word

w32ToFloat :: Word32 -> Float
w32ToFloat w
  | ep == 255 && sf /= 0 = 0 / 0
  | sf == 255 = sign / 0
  | sf == 0 && ep == 0 = sign * 0
  | otherwise = sign * encodeFloat r e
  where
    sn = shiftR w 31
    ep = shiftR w 23 .&. 0xff
    sf = w .&. 0x7fffff

    sign = if sn == 1 then -1 else 1
    e = fromIntegral ep - 127 - 23
    r = fromIntegral sf + 0x800000


801 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 01:37:29 ]
バイト列をFloatとして解釈させたいわけだから、
必要なのは Word32 -> Float じゃなくて [Word8] -> Float なんじゃなかろうか。
というわけでPtr経由だけど書いてみた。

import Foreign

fromBytes :: Storable a => [Word8] -> a
fromBytes bs = unsafePerformIO $ allocaArray (length bs) $ \ p -> pokeArray p bs >> peek (castPtr p)

toBytes :: Storable a => a -> [Word8]
toBytes x = unsafePerformIO $ alloca $ \ p -> poke p x >> peekArray (sizeOf x) (castPtr p)

toBytes (0.5 :: Float) => [0,0,0,63]
fromBytes [0,0,0,63] :: Float => 0.5

802 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 09:32:32 ]
で、整数のendianはどうするとか色々とケチがついていくにしたがって、重くて遅いコードに変身していくわけだ。

803 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 10:50:10 ]
endian変更は[Word8]にreverseかければ良いんじゃね。

システムのendian判定はこんな感じ?
isLittleEndian = (1 :: Int) == fromBytes [1,0,0,0]
isBigEndian = (1 :: Int) == fromBytes [0,0,0,1]

804 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 13:03:52 ]
やっぱり>>800にはバグがあった
-  | sf == 255 = sign / 0
+  | ep == 255 = sign / 0

>>802
[Word8]からWord32を作って、そこからFloatにすればシステムのendiannessを気にする必要ないよ
この場合PtrやUArrayを経由するのでもencodeFloatでも良い

805 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 17:35:05 ]
-- テストしてみた。

-- import Test.QuickCheck

(f `eq` g) x = Result (Just (f x == g x)) [] [show (f x), show (g x)]

forAllBinaryFloat :: (Testable b) => ([Word8] -> b) -> Property
forAllBinaryFloat t =
 forAll (choose (0,1)) $ \s ->
 forAll (oneof [elements [0,255], choose (1,254)]) $ \e ->
 forAll (oneof [elements [0], choose (1,2^23-1)]) $ \f ->
 t (sefToBytes s e f)

sefToBytes :: Int -> Int -> Int -> [Word8]
sefToBytes s e f = endian [shiftL s' 7 .|. shiftR e' 1, shiftL e' 7 .|. f1, f2, f3]
 where
 [_,f1,f2,f3] = endian (toBytes f)
 [s',e'] = map fromIntegral [s,e]
 endian = if head (toBytes (1 :: Word32)) == 1 then reverse else id

prop_float :: (Float -> Float) -> Property
prop_float fl2fl = forAll (oneof fls) (id `eq` fl2fl)
 where fls = [elements [0,{-0/0,-}1/0,-1/0], fmap (/ 2^127) arbitrary, arbitrary]

prop_bytes :: ([Word8] -> [Word8]) -> Property
prop_bytes bs2bs = forAllBinaryFloat (id `eq` bs2bs)

806 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 17:36:01 ]
-- quickCheck test1 や verboseCheck test5 とかで実行。

test1 = prop_float (fromBytes . toBytes)
test2 = prop_float (w32ToFloat . fromBytes . toBytes)
test3 = prop_float (uncurry encodeFloat . decodeFloat)
test4 = prop_bytes (\bs -> toBytes (fromBytes bs :: Float))
test5 = prop_bytes (toBytes . w32ToFloat . fromBytes)
test6 = forAllBinaryFloat $ \bs -> not (isNaN (fromBytes bs :: Float)) ==>
 (fromBytes `eq` (w32ToFloat . fromBytes)) bs

{- 1, 3 は通った。最初 NaN/=NaN をうっかりした。
w32ToFloat は非正規化数を無視してるので、2, 5, 6 が通らなかった。
4 は NaN のときに、仮数部の最上位ビットがおかしくなった。
5 は w32ToFloat は NaN を全て 0/0 にするのもあって通らなかった。
NaN の表現が変わるのは Float を解釈する場面
(つまりコピーとかじゃない)なら問題無いだろうけど。-}

807 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 21:41:10 ]
QuickCheckすげー
盲目的なランダムテストだけじゃないのな

概念的には、(ieee754で表現される)外部フォーマットのデータを読んで、
ネイティブのFloatに変換して使いたいのか、
それともieee754データとしてそのまま扱いたいのかでやることが変わってくるな
実際にはどうせieee754を採用してるアーキテクチャでしか動かさないから、ショートカットが効くわけだけど



808 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 01:51:57 ]
QuickCheckってどうも使い方が解らない。
テストが元実装と結局ほとんど同じにならない?
元実装は仕様をすでに表してるわけで、その仕様にあってるか確認するコードは、
結局同じになるのは必然だと思うんだけど。
仕様から演繹出来る他の事を確認しろって事かな?
でも、演繹で導かれる事が、元仕様とは別の理由で成り立つ事もあるよね?


809 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 03:06:21 ]
>テストが元実装と結局ほとんど同じにならない?
ならない。>>805-806を見れば分かる通り

>元実装は仕様をすでに表してるわけで、その仕様にあってるか確認するコードは、
>結局同じになるのは必然だと思うんだけど。
そういう場合もあるし、そうでない場合もあるから、決して必然じゃない
たとえば、ソート関数が正しいかどうか確認するコードと、
実際にマージソートやクイックソートをするコードは全然違うものになる
さらに「マージソートでもクイックソートでも結果が同じになる」みたいなのもテストになるし

>でも、演繹で導かれる事が、元仕様とは別の理由で成り立つ事もあるよね?
もちろん
だれもテストで全ての誤りを発見できるとは思ってない

810 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 14:26:34 ]
あと、ランダムテストが有効な場合とそうでない場合があるよね。
>>805-806はあまりランダムである必要が無いかも。
きわどいケース(上の場合だと0、非正規化数、無限大、NaN)を
並べ上げにくい場合にランダムテストが有効な気がする。

811 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 14:35:10 ]
ああそうか、例えばソートの例の場合、
「正しくマージソート出来てるか」じゃなくて
「正しくソート出来てるか」のテストになるからか。

前者はQuickCheckに関わらず外部テストでは確かめようがないから、
「ソートする」じゃなくて「マージソートする」という仕様はソースレビューするしかないのか。

812 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 16:36:28 ]
単なる関数じゃあまり意味がなくて、
結果としてのアウトプットが特徴的で綺麗な性質を持ち、
かつ、その性質自体が目的である場合に威力を発揮するって感じか。
その類の物は、性能が競われる事が多い気がするから、その辺りのサポートもあると良いかも。

813 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 18:38:09 ]
2chって連続した半角スペースが に置換されるようになったの?

f :: A -> B のテストは
・B (or A) の == を使う場合
  ・一般の場合
    ・h :: A -> B を用意して f x == h x をテスト
  ・逆関数 g :: B -> A がある場合
    ・x == g (f x) をテスト
    ・y == f (g y) をテスト
・使わない場合
  ・r :: A -> B -> Bool をうまく用意して r x (f x) をテスト
(テストはランダムな x :: A, y :: B に対して)
大概こんな感じ。

元実装とほとんど同じテストってのは、
g やうまい r が無くて、f x == h x というテストしか無いんだけど、
f と違う h も無くて、でも f x == f x じゃバカ丸出しなので、
== を明示的には使わないで実質的に f x == f x と同じことをやる、
みたいな感じじゃないかな。

814 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 18:39:53 ]
うわ俺バカ丸出し。&nbsp;って書きたかった。

815 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:31:09 ]
datを直接見るようにすればnbspなんて使わなくてもインデントされるよ

816 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 12:19:55 ]
滅茶苦茶な事を聞いていそうで済みませんが、
cabal configure と runhaskell Setup.hs configure、
cabal build と runhaskell Setup.hs build、
cabal install と runhaskell Setup.hs install、
って何か違うんでしょうか。
同じだとしたらなんのために両方あるんでしょうか。

817 名前:初心者修業中 mailto:sage [2008/10/08(水) 15:33:21 ]
>>816
・runhaskell はHaskellのソースプログラムを実行するコマンド
・cabal はパッケージをインストールするコマンド
…と認識しています。

参考

ttp://haskell.g.hatena.ne.jp/illillli/20080224



818 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 23:08:47 ]
オラ本でねーぞコラ


819 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 00:31:08 ]
cabal なんてコマンドあるの?
あるとしたら runghc Setup と打つより楽だからじゃ?

820 名前:初心者修業中 mailto:sage [2008/10/09(木) 01:00:41 ]
>>819
参考

ttp://haskell.g.hatena.ne.jp/illillli/20080224
cabal-installというパッケージにcabalというユーティリティがあった。
パッケージのダウンロードからインストールまでを自動化してくれるようだ。

821 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 04:00:42 ]
今んとこ、RubyGemsを目指して整備中って事で、
最終的にSetup.hsはなくなるかオプショナルになってcabalコマンドに統一されるんじゃない?
page.freett.com/shelarcy/log/2007/diary_03.html#when_we_can_use_caball-install
hackage.haskell.org/trac/hackage/wiki/RubyGems

現時点でのそれら重複してるコマンドの詳細は判らないけど、installについては、
cabal install monadius
monadius
で遊べるってのは、Setup.hsでは無理だろう。


822 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 04:20:27 ]
>>821
RubyGemsなんて目指されると非常に困る。

823 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 12:13:24 ]
ん?どんな風に?

824 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 18:45:20 ]
質問です。
Haskellにて、二次元配列を時計回りに90度回転させるには、どうすればいいでしょうか?

今あるコードが
rot90 list = reverse (map (head) list) : rest
where rest = if length (concat taillist) == 0 then []
else rot90 taillist
where taillist = map tail list
ですが、ものすごく非効率的だと思います。

825 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 19:03:11 ]
>>824
length (concat taillist) == 0
の部分を
all null taillist
にでもすれば別に非効率的でもない気がする

俺ならtransposeを使うな
rot90 = transpose . reverse

826 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 19:24:00 ]
>>825
素早い回答ありがとうございます。
実は、transposeも定義しないといけなく、transposeでrot90を使っているので…。

transpose list = rot90 (hflip list)
hflip list = reverse list

というふうになっております。

827 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 19:39:20 ]
どうしてもrot90でtransposeを定義しなきゃいけないの?
そうでなくて単にtransposeが必要ってだけならその定義は捨てて
import Data.Listしてtransposeを使えば良いんじゃない?



828 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 19:45:38 ]
transposeって標準の関数ではないんですか?

829 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 19:53:59 ]
>>827

課題では、自分でtransposeを定義しろ、とのことでした。

830 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 20:20:13 ]
>>828
Prelude関数ではないのでData.Listをインポートしないと使えない。

>>829
だったら >>825 が最初に言ってる変更をするか、rot90を使わずにtransposeを定義すれば。

831 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 21:12:45 ]
Data.Listのtransposeはこれ
transpose :: [[a]] -> [[a]]
transpose [] = []
transpose ([] : xss) = transpose xss
transpose ((x:xs) : xss) = (x : [h | (h:t) <- xss]) : transpose (xs : [ t | (h:t) <- xss])

832 名前:デフォルトの名無しさん mailto:sage [2008/10/10(金) 06:57:02 ]
>>813
連続した半角スペースはjavascriptモードで書き込むときに置換されるらしい。

>>824-825
長方形じゃないときに、all だとエラー、any だと長方形になるように切り落とす。
filter 使えば>>831の transpose に map reverse . したような感じになる。
([<h or t> | h:t<-xss] = map <head or tail> (filter (not.null) xss))

違ったやり方なら
rot90 = foldl c []
 where
  c yss [] = yss
  c [] xs = [[x] | x<-xs]
  c (ys:yss) (x:xs) = (x:ys) : c yss xs
とか。

833 名前:デフォルトの名無しさん mailto:sage [2008/10/10(金) 07:01:54 ]
あ、any じゃ list == [] のときまずいという話もあるか。

834 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 00:49:41 ]
>>823
パッケージの管理方法にいろいろと問題がある。

835 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 01:26:24 ]
>>834
具体的に言ってくれよ。そして開発者達にも。

836 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 20:53:56 ]
質問です。ディレクトリの階層構造をData.Tree型に納めようとしてい
るのですが、遅延評価が効くようなコードが書けません。
type FileTree = Tree FilePathとして、以下のような関数を作ってみたのですが。
recursiveFileTree :: FilePath -> IO FileTree
recursiveFileTree name = do
 contents <- catch (getDirectoryContents name) (\e -> return [])
 children <- let
  filtered = filter filterDots contents
  pathadd = map (\x -> name </> x) filtered
  mapped = map recursiveFileTree pathadd
  in sequence mapped
 return (Node (takeFileName name) children)
  where filterDots :: FilePath -> Bool
   filterDots "." = False
   filterDots ".." =
   filterDots _ = True
(インデントしてるように見せるために全角スペースを入れています。見えますか?)
おそらくsequenceで[IO FileTree] -> IO [FileTree]としているあたりが問題なのだと思いますが、解決策が分かりません。

837 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 22:14:59 ]
・unsafeInterleaveIOを使う
・Data.Treeを使うのをやめて、明示的なIOを伴う木を定義して使う

好きな方を選んでくれ



838 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 22:22:13 ]
一応言っておくが、HaskellのIOは基本的に遅延しないし、普通はそれで正しい
IOは実行順が重要なことが多く、遅延させて順番をうやむやにすると厄介なことになりやすい
それだとどうしても不便というときのためにunsafeInterleaveIOがある

839 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 10:12:08 ]
f a b c の部分適用として f a b と書くことはできますが、(\a -> f a b c) にあたる部分適用を a を省略して書く方法はありますか?

840 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 11:26:17 ]
flip使え

841 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 17:56:42 ]
flip (flip f b) cはさすがに悪趣味だろ

842 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 18:02:48 ]
(\a -> f a b c) → 15文字
flip (flip f b) c → 17文字

843 名前:デフォルトの名無しさん [2008/10/30(木) 19:39:38 ]
($c).($b).f flip (`f`b) c

844 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 19:45:59 ]
こんなのもありました。

(flip.(flip f)) b c

3引数flip
haskell.g.hatena.ne.jp/mr_konn/20061223/1166869265

845 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 19:54:21 ]
>>844>>841 の変形だね。
あと、内側の括弧は無くてもOK

846 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 21:45:30 ]
f # b c みたいな構文(# は未適用引数を表す)があったら便利だったかもね

847 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 23:03:15 ]
SRFI 26 みたいな?



848 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 23:47:19 ]
\x->f x b c

849 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 08:29:54 ]
>>848
>>839

850 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 11:19:22 ]
>>846
それだと
f # b c -- \a -> f a b cと同等

(f #) b c -- (\a -> f a) b cと同等
を区別する必要が出てきて面倒だな

851 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 13:03:16 ]
d.hatena.ne.jp/m-hiyama/20081031/1225416719
ブログ持ってないのでここで。酒井さんのパクリ。

{-# OPTIONS -fglasgow-exts #-}

import Control.Monad (liftM2)
import Data.Either
import Test.QuickCheck


infix 4 :<->:
type a :<->: b = (a -> b, b -> a)

(.>) :: a:<->:b -> b:<->:c -> a:<->:c
(f1,g1) .> (f2,g2) = (f2 . f1, g1 . g2)

un :: a:<->:b -> b:<->:a
un (f,g) = (g,f)


type a :+: b = Either a b
infixr 5 :+:

alt :: a:+:b :<->: b:+:a
alt = (f,f) where f = either Right Left

swap :: a:+:b:+:c :<->: b:+:a:+:c
swap = (f,f) where f = either (Right . Left) (either Left (Right . Right))

rt :: b :<->: c -> a:+:b :<->: a:+:c
rt (f,g) = (r f, r g) where r = either Left . (Right .)

852 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 13:04:16 ]
data T = L | N T T deriving (Eq, Show)

fold :: a:+:(T,(T,a)) :<->: (T,a)
fold = (f,g)
 where
 f (Left a)            = (L,a)
 f (Right (t1,(t2,a))) = (N t1 t2,a)
 g (L,a)       = Left a
 g (N t1 t2,a) = Right (t1,(t2,a))

h :: (T,a) :<->: a:+:(T,a):+:(T,(T,(T,a)))
h = un fold .> rt (un fold)

s :: a:+:(T,(T,(T,a))) :<->: (T,a):+:(T,(T,(T,(T,a))))
s = rt (un fold .> alt) .> swap .> rt fold .> alt

853 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 13:05:44 ]
st :: (T,a) :<->: (T,(T,(T,(T,(T,(T,(T,a)))))))
st =
 -- T
 h
 -- 1 + T + T^3
 .> swap
 -- T + 1 + T^3
 .> rt (s .> s .> s .> s
 -- T + T^4 + T^7
       .> alt)
 -- T + T^7 + T^4
 .> swap
 -- T^7 + T + T^4
 .> rt (s .> s .> s .> s .> s)
 -- T^7 + T^6 + T^9
 .> swap
 -- T^6 + T^7 + T^9
 .> un h
 -- T^7

854 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 13:08:02 ]
instance Arbitrary T where
 arbitrary = oneof [return L, liftM2 N arbitrary arbitrary]

main :: IO ()
main = do
quickCheck $ \x -> x == (snd st (fst st x) :: (T,()))
quickCheck $ \x -> x == fst st (snd st x :: (T,()))


型検査で漏れてるのは fold の定義ぐらいで、QuickCheck 意味ないのかも。

855 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 11:50:00 ]
すげえ、読みやすいな

856 名前:デフォルトの名無しさん [2008/11/05(水) 07:40:02 ]
GHC 6.10.1リリースあげ

857 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 08:34:43 ]
((f.) . g) a b
みたいなテクニックが沢山載ってるようなページを教えてください



858 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 12:06:08 ]
unsafeInterleaveIO :: IO a -> IO a
unsafeInterleaveIO (IO m)
= IO ( \ s -> let
r = case m s of (# _, res #) -> res
in
(# s, r #))

この#って何なんですか?ghc6.8.2ではエラーになりますし…

859 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 12:38:02 ]
>>858
unboxed tupleってやつだね。
itpro.nikkeibp.co.jp/article/COLUMN/20070206/260872/?ST=develop&P=2

>>856
Windows版を入れてみたんだけど、ライブラリの置き場所がキモイな。
6.8だと$topdir/lib以下に入ってたのが6.10.1だと$topdirに入ってる。
キモイし$topdirの見通しも悪いので6.8と同じように$topdir/libの中に移動して
package.confの中の$topdir\\を$topdir/lib\\に全置換した。

860 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 14:29:51 ]
>>859
ありがとうございました
拡張構文なんですね

861 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 23:45:00 ]
weakリダクションって何?

862 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 00:10:49 ]
googleで検索したらひっかかったので、ここに書かせていただきます。質問していいでしょうか?

Haskellの処理系だけを使って、prologみたいなことができないか調べています。
↓でprologのタプル parent(tom, bob). のような感じにすると、

parent::[Char]->[Char]->Bool
parent "tom" "bob" = True
parent "liz" "bob" = True
parent "mike" "liz" = True
parent _ _ = False

とりあえず、
main = print $ parent "tom" "bob"
main = print $ parent "mike" "bob"
で True や False が出て、prologっぽくなります。

そこで、
parent X "bob"
という質問に対し、
X=tom
X=liz
みたいに変数にユニファイするような定数を手に入れるような仕組みってあるでしょうか?

入門書に、コンパイル時に内部でグラフを作るみたいな話が書いてあったので、
そのグラフを参照できるようなことができれば実現できると思うのですが、無理でしょうか?

863 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 00:23:23 ]
>>862
無理
Haskellの関数は文字通り関数なので、引数を放り込んで結果を観察する他に使い道は無い

864 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 00:43:20 ]
中間形式のグラフみたいなの見れないのん?

865 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 01:15:29 ]
中間形式のグラフって何?
グラフ簡約のことを言ってるのなら、グラフが作られるのは実行時だし、
要するに「未評価の式」を表してるだけだから、それを見ても>>862みたいなことをする助けにはならんよ

866 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 01:27:35 ]
少なくとも書こうとしてるプログラムの中からは見れない。
Haskellって厳格な言語で、その手の変なことは基本的にできないよ。
何をやりたいのか知らないけど、インタプリタ的なものを書いて、
それをライブラリとして使えば?

867 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 01:38:05 ]
ん、普通にMaybeとかそれ以前にListモナドとか使えば普通に実現出来るって云うかモナドのすべて読んだ方が良いと思うよ



868 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 02:16:43 ]
関数から引数への参照は、関数が展開されても複数の場所から同じ場所を参照するという話と、
先にグラフを作って、実行時に、そこにデータを流し込むような感じの説明があったから、
処理系をそのまま利用して、かなり高速なデータベースが作れると思ったんですけどダメですかね。

実現できればprologよりも表現能力が高いから面白そうだと思ったんですが。

869 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 03:27:38 ]
>関数から引数への参照は、関数が展開されても複数の場所から同じ場所を参照する
これはその通り

>先にグラフを作って、実行時に、そこにデータを流し込む
これはぜんぜん違う
多分どこかで誤読してると思う

870 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 11:40:05 ]
>>867
zs <- everything
append [1..100] [1..100] zs
こういうやり方じゃ生きてるうちに終わらないかもよ。
Listモナドは、もちろんユニフィケーションや制約伝播なんて無くて、
総当りで解を求めようとする非決定性計算ってだけなんで。

871 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 11:50:02 ]
yet another embedding of pure Prolog into Haskell
okmij.org/ftp/Prolog/Arithm/DefinitionTree.hs

いまいち使い方はわからんけど、ググったら見つかったので貼っておく。

872 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 20:48:35 ]
>>870
failや[]で枝狩り


873 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 00:44:22 ]
>>872
変数をどう表現して、何をどう枝刈るの?


874 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 08:25:24 ]
887 名前:デフォルトの名無しさん[] 投稿日:2008/11/22(土) 00:28:37
Real World Haskellは糞本だと思う

875 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 12:49:16 ]
出版されたの?

876 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 23:01:38 ]
出版されたかは知らないけど訳してる人がいる
ttp://d.hatena.ne.jp/mokehehe/20081124/rwh

877 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 23:27:23 ]
始まったばかりにしても、ひでえ訳



878 名前:デフォルトの名無しさん [2008/11/25(火) 23:41:58 ]
Real World Haskellって翻訳本が出ると思いますか?
マイナーな言語だけど、微妙にブームになってるし
来年ぐらいに出版されたりするかなあ?

879 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 23:48:26 ]
確かに一時期あったけど、とっくに沈静化したような…>ブーム

880 名前:a36 ◆K0BqlCB3.k mailto:sage [2008/11/25(火) 23:50:52 ]
>>879
最近は沈静化したように見せかけて、ジワジワきてるよ。
各大学の卒研レベルではHaskellやったりしてるところが増えてきてる。

881 名前:デフォルトの名無しさん [2008/11/26(水) 00:04:13 ]
うーん、訳の出来とは別になんか期待できなさそうな感じ


882 名前:a36 ◆K0BqlCB3.k mailto:sage [2008/11/26(水) 00:08:27 ]
原文自体平易な英文なので今後のことを考えるなら英文に慣れるために原文で読むことをお勧めします。

883 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 00:12:16 ]
まだ10章までしか読めてないけど
ふつケルの次くらいに読む分には悪くないと思う>RWH

タダだし

884 名前:デフォルトの名無しさん [2008/11/26(水) 00:17:39 ]
本買おうと思ったけど、WEBで読めるわけだし
翻訳本が出るまでそれですまそうかなw

885 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 00:19:34 ]
RWHクソだろ〜
11章からはページを増やすためにネタを書きましたって
レベルのオナねたのオンパレードだぞ

886 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 00:36:34 ]
RWHってネットでもう出回ってるんだなw

887 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 00:45:56 ]
出回ってるつーかあれを最近本にしたんでしょ?



888 名前:デフォルトの名無しさん [2008/11/26(水) 00:49:09 ]
存在型ってなんですか?

889 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 01:23:56 ]
バキシルとか大麻のことだ

890 名前:デフォルトの名無しさん [2008/11/26(水) 01:48:33 ]
ありがとうございます。

891 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 07:48:38 ]
>>888
Cardelli読め

892 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 13:02:02 ]
Haskell: The Craft of Functional Programming

Programming in Haskell
のどちらがお勧めですか?ふつけるの次くらい。

893 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 21:24:32 ]
>>884
下手糞な翻訳の恐れ大。最近多いね、いや昔からか

894 名前:デフォルトの名無しさん [2008/11/26(水) 22:52:49 ]
Programming in Haskellはいいよ。ふつけるの前でもいいです。

895 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 19:14:12 ]
>>892
自分はふつけるの後にCraftでした。というか、その間にSICPが
あるので、あんまり参考にならないかな。ふつける読んでも
ちょっとピンとこなかったんですね、よくまとまってるとは思うのですが。

自分は普通の文系プログラマで、関数型プログラミングの世界とは
無縁だったので、SICPをくぐる必要があったと感じてます。


896 名前:デフォルトの名無しさん [2008/11/27(木) 19:30:50 ]
Craftはいつ第3判が出るのですか?

897 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 19:55:34 ]
Craft第2版以降で目立ったHaskellの技法というと、Arrowぐらいでしょうか。

あとはReal Worldみたいな実用面を書いたものになりますかね。



898 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 20:02:06 ]
ガンズのニューアルバムが出るころに出版されるそうです。

899 名前:デフォルトの名無しさん mailto:sage [2008/11/28(金) 20:17:32 ]
それは出版されないってのとどう違うのだ

900 名前:デフォルトの名無しさん mailto:sage [2008/11/28(金) 22:32:12 ]
泳げる頃にh(ry

901 名前:デフォルトの名無しさん mailto:sage [2008/11/28(金) 23:59:30 ]
1版ならともかく3版なら別に出なくてもいいんじゃね

902 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 00:04:26 ]
Implementing Functional Languages: a tutorial

ってのをやってますが、練習問題の回答とかどっかに転がってますでしょうか。

903 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 11:25:49 ]
>>902
著者本人が公開してる。あとは自分で探せクズ。

904 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 11:27:36 ]
>>903
おめーがクズだろ
この引きこもりw

905 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 21:15:40 ]
自演乙

906 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 22:05:13 ]
Haskellで書かれた数式処理ソフトがあると聞いたのですが
maximaと比べると
言語から直接利用するときの利用しやすさは、どんな感じなのでしょうか?

907 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 09:20:37 ]
PJの答を探しているクズ、どこのゼミ生かしらんが、これで次の輪講はアウトだなwww



908 名前:902 mailto:sage [2008/11/30(日) 09:56:28 ]
>>907
自分では探してみましたが、部分的なコードだけしか見つけられませんでした。

ちなみに、自分は学生ではないんです。輪読の場があったりしたら入りたい
ですけど、ちょっと今は時間的に厳しいかな。ネットでやってたりするといいん
ですが。

909 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 16:00:41 ]
探すもなにも、入手方法ちゃんと書いてあるじゃんwww

910 名前:デフォルトの名無しさん [2008/11/30(日) 21:28:44 ]
>>896
2021年4月19日に出るみたいです。
まだ相当先ですね。

911 名前:デフォルトの名無しさん mailto:sage [2008/12/01(月) 20:25:35 ]
どんどん延期してると思ったら
今度はありえないくらいに延ばしたな・・・

912 名前:デフォルトの名無しさん [2008/12/07(日) 12:54:19 ]
ghci の補完って windows じゃ効かないんですかね。
Linux 上だとちゃんと動いて便利だったのでショックです。

ネット探してみると rlwrap 使えとかあったけど
rlwrap って動的な補完(スコープ内の関数一覧等)
って可能なんでしょうか。

913 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 13:54:21 ]
そんな高度な補完はemacsのinferior-haskellとかeclipseの拡張でもできるかどうか怪しいな

914 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 13:56:28 ]
英語配列30g早く!

915 名前:902 mailto:sage [2008/12/07(日) 20:05:48 ]
>>909
書いてありました。これって個人でも送ってくれるのでしょうかね。

ただ、まだ半分ぐらいなんですけど、問題簡単なので別に解答不要
になりそうです。ありがとうございました。

916 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 18:52:49 ]
do記法と(>>=)の対応についてですが、
do;putStr "a\n";putStr "b\n";putStr "c\n";

putStr "a\n" >>= (\_->putStr "b\n" >>= (\_-> putStr "c\n"))
なんですかね?

右結合的になったり匿名関数に変換されたりと難しいです

917 名前:a36 ◆K0BqlCB3.k mailto:sage [2008/12/13(土) 19:06:24 ]
>>916
一緒です。
でも
putStr "a\n">>putStr "b\n">>putStr "c\n"
と書いた方がきれいですよ。



918 名前:a36 ◆K0BqlCB3.k mailto:sage [2008/12/13(土) 19:06:57 ]
あと、括弧なくても良いですよ。

919 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 10:36:09 ]
なるほど、そう言えばlambda式ってかなり優先順位が高いんでしたね
ありがとうございました

920 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 15:42:38 ]
F#からポロロッカしてきました

fold/undold、flip とかを使った関数合成がすげえ苦手なんですが
このあたりに特化した書籍とかってないでしょうか

モナドとか継続とかはわりとどうでもいいんですが

921 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 16:19:34 ]
プログラムの変形やそこで使う公式を見るのがいいと思う。
birdがそういうの得意な人だから、
Introduction to Functional Programming using Haskell
www.amazon.com/Introduction-Functional-Programming-using-Haskell/dp/0134843460/
"Using Haskell"じゃない前の版の方がその辺は内容が濃かった。

The Algebra of Programming
www.amazon.com/Algebra-Programming-Prentice-Hall-International-Computer/dp/013507245X/
は関数合成、変形ドリルみたいな内容だった。
たしかparserを必要な機能を持つように変形する論文もあったはず。



922 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 17:06:40 ]
undoldって何かと思ったけど、unfoldの間違いだよね?


923 名前:920 mailto:sage [2008/12/14(日) 17:19:51 ]
間違いですw

>>921
ありがとう
Introduction〜とRealWorldHaskellをぽちってみました
下は高杉…

924 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 17:13:13 ]
yet another haskell tutorialの4.6で

cfold' f z [] = z
cfold' f z (x:xs) = f x z (\y -> cfold' f y xs)

という継続fの与え方次第でfoldlにもfoldrにもなるものが出てきたんですが
普通のfoldlやfoldrの定義からこれを導きだす手順のようなものがあるなら知りたいです

また「なんでも再帰」流に一つ引数増やして、最後にそれを必ず呼び出すようにして
末尾再帰の形に直していく…ってやり方で書こうとしてますがさっぱりです

925 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 12:48:15 ]
面倒だからfactorialで書くと、
fac 0 = 1
fac n = n * fac (n-1) なのか
fac n = fac (n-1) * n なのかってことだから、

fac n = ((n *) . fac) (n-1)あるいは、
fac n = ((* n) . fac) (n-1)

fac n = (((\m ->(m *)) n) . fac) (n-1)あるいは、
fac n = (((\m ->(* m)) n) . fac) (n-1)

fac0 f n = ((f n) . (fac0 f)) (n-1)で
fac0 (\m ->(m *)) nあるいはfac0 (\m ->(* m)) n

\m ->(m *)と\m ->(* m)は、
fac(n-1)を計算した後にすべき計算、つまり継続になっています。



926 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 12:51:01 ]
要するにfoldってのは累積を計算しているのだから、
その累積演算を関数に独立させると、foldの性質上、継続的になるのです。
mapだとこうはなりません。

927 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 22:40:24 ]
>>926
ところがどっこい、この説明のすぐ後で、
「CPSを使ってmapとfilterを書け」なんて演習問題が出されてるわけですよ。

それを考えると、foldlの定義からcfold'へ持っていってあげたほうが
親切かもしれません。



928 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 22:53:36 ]
あっと、「この説明」ってのは
「yet another haskell tutorial の cfold' の説明」のことね。

929 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 23:38:03 ]
>>927
cfold'は、元のfold*の引数に渡す演算自体が継続的になるのに対して、
mapでは引数に渡す演算ではなくて、:が継続的になるわけです。
だからYAHTでは微妙に表現を変えています。
map f = foldr (\x -> ((f x) :)) []
ですから当たり前ですけども。

930 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 19:38:36 ]
>>929
すまん、「継続的」という言葉の意味がさっぱり分からん。
CPSにしたときに最後に行われる計算、という意味なら、
foldlは「foldl」自体が継続的、
foldrは引数として渡す関数「f」が継続的ということになるので、
fold*で継続的となる関数が同じになるとは思えない。

931 名前:デフォルトの名無しさん [2008/12/21(日) 19:58:16 ]
おそらく激しいFAQだとは思うのですが、日本語の扱いについて。
Charの仕様からして、 >>5の「i. CharをUnicodeとして扱う」が筋と思いますが、
リテラルはともかく、IOでの変換のスタンダードな方法はもう固まってきてるでしょうか。
blog.kfish.org/2007/10/survey-haskell-unicode-support.html によると、
メジャーな方法が3つあるらしいですが、どれか、もしくはどれかがdefactoになっているでしょうか。
Haskell'でも使えるのがいいですが…。

932 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 22:14:48 ]
utf8-stringっぽいかな‥‥






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

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

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