関数型プログラミング ..
[2ch|▼Menu]
271:デフォルトの名無しさん
07/12/10 15:07:15
無限リストって便利だけど、末尾を正格に要求する関数について型安全じゃないよね。
でも無限リスト型を再定義するとリストに関して作ったすべての関数について委譲関数を作んなきゃいけなくて現実的じゃない。
結局これは妥協するしかないのか?それともなんらかのテクニックで回避できる?

272:デフォルトの名無しさん
07/12/11 10:46:48
>>271
日本語でおk

273:デフォルトの名無しさん
07/12/11 10:52:25
>>271
俺の知る限り、妥協するしかない

274:デフォルトの名無しさん
07/12/11 12:46:45
>>271
評価がとまらないだけで型安全だよ。

275:デフォルトの名無しさん
07/12/11 13:17:06
そう言えば、厳密に言うと無限ループでも型安全なんだな
でも全域関数でない関数が厄介なことは事実だから、何か呼び名が欲しい

276:デフォルトの名無しさん
07/12/11 17:14:07
>>275
よくわかんないけど、チューリングの停止問題のこと言ってるの?

277:デフォルトの名無しさん
07/12/11 17:30:25
>>276
いや、Haskellには失敗し得る関数があるじゃん
例えば、headはリストが空の時例外を飛ばすし、
lengthは無限リストに適用されたら終わらない
一方で、例えばdropみたいに、引数に未定義値が含まれない限り、
あらゆる引数に対してちゃんと値をもどす関数もある
だからこの二つを区別できるように、短い呼び名があれば便利だな、ということ
「型安全」という言葉を使いたくなるけど、これは>>274の言う通り誤用だし

278:デフォルトの名無しさん
07/12/11 17:40:12
>>277
そういう一般的な関数のことを部分関数というんじゃないかね

279:デフォルトの名無しさん
07/12/11 18:03:01
>>278
全域関数も部分関数の一種だから、とか考えてたけどカジュアルに使う分には問題ないか
グダグダですまん

280:271
07/12/11 19:46:50
いや、同じ構造のデータ型でも、
型システムで『無限リストかそうでないか』をカッキリ分けられたら、
そっちのほうが型安全にならないかな?と思って271を書いたんだけど。

たとえば幽霊型とか使ってそういうのが解決できないかとか思ったんだけど、
それじゃ現行の関数を活かせないし、あんまり意味ないなあ、と。

281:デフォルトの名無しさん
07/12/12 01:00:18
>>280
言いたいのは、型システムを使って、
無限リストのフロー解析をして、
プログラムの停止性、正当性などを知ることができないかってこと?
それならリストの有限性の抽象解釈をやるってことになると思うけれど。

282:271
07/12/12 01:16:01
>>281
違う。返り値が無限リストの関数で、その関数の型を明示しておけば、
無限リストに対して使ってはいけない関数の引数にした時に型エラーになるようにしたい。
まあ無理っぽいのでもう諦めてるけどな。

283:デフォルトの名無しさん
07/12/12 02:43:32



※起こりえる全てのリストのうちどれが有限リストかを確かめることは
 無限に長いリストに対して演算を行うことと同じ


ってだれかが言ってた

284:デフォルトの名無しさん
07/12/12 07:57:59
だから誰も自動チェックしてくれって言ってるわけじゃないじゃない……
静的に型推論してくれるんだから、
enumFromにInt a => a -> [a] Inf
って書けるとして
lengthに[a] Ltd -> Int
みたいに指定したらコンパイルエラーになって欲しいとかそういう問題だって。無理だけど。

285:デフォルトの名無しさん
07/12/12 08:17:31
enumFromよりrepeatのほうが良かったな(repeat :: a -> [a] Inf)
あとコンパイルエラーになって欲しいのは『length.repeat x』みたいな文脈な。

286:デフォルトの名無しさん
07/12/12 09:39:03
strictな言語なら、force/delayみたいに陽に指定するんだろうから、
>>281の言うような方法も効果を挙げるだろうが、
lazyな言語だと、リストを生成する全ての関数が、
無限リストを返す可能性があるので>>276でFAだが。

[1..]が無限リストであることも、解析が必要になるし。
うまくできるケースもあるが、希少すぎる。

287:デフォルトの名無しさん
07/12/12 11:18:26
>>271が見事に無視されててワラタ

288:デフォルトの名無しさん
07/12/12 11:39:59
言葉の使い方間違ってるよな。

289:デフォルトの名無しさん
07/12/12 17:16:57
なんというか残念賞な言語だな。
関数言語としてのおいしいところは全てC#3.0に持っていかれてしまった。

290:デフォルトの名無しさん
07/12/12 17:26:09
それはギャグのつもりでいっているのか

291:デフォルトの名無しさん
07/12/12 17:27:04
>>289
関数言語?w
C#3.0?w

292:デフォルトの名無しさん
07/12/12 18:12:14
>>289
F#じゃなくて、C#かよ・・・

293:Wadler
07/12/12 22:26:38
Haskell初心者です。
a->[a]という(型の)monad(仮にDとしましょう)をつりたくて困っています。
どなたか教えてください。
とくにDのmapFにあたる関数も教えていただけれありがたいです。

294:デフォルトの名無しさん
07/12/12 23:11:10
>>293
はい?

295:デフォルトの名無しさん
07/12/12 23:12:01
とりあえず、日本語でおkと言ってほしいのですか?

296:デフォルトの名無しさん
07/12/12 23:13:50
>>295
日本語でおk

297:デフォルトの名無しさん
07/12/13 00:02:02
よくわからんが
data D a = mkD (a -> [a])
instance Monad D where ...
ってことか?
あとmapFってなんだ?fmap?

298:デフォルトの名無しさん
07/12/13 01:20:15
>>293
よくわからんが、釣りってことか?

299:デフォルトの名無しさん
07/12/13 01:23:14
>>297
mkDはなぜ先頭が大文字になってないんだ?
受理されないだろ。

300:デフォルトの名無しさん
07/12/13 01:25:29
なんなんだ?
近頃Haskellerの質の低下が激しすぎるぞ

301:デフォルトの名無しさん
07/12/13 02:15:06
昔からです


302:デフォルトの名無しさん
07/12/13 02:20:10
割と玉石混淆なイメージだね

303:デフォルトの名無しさん
07/12/13 02:23:35
暇つぶしで弄ってる学生がここで暇を潰しているイメージ

304:デフォルトの名無しさん
07/12/13 08:17:19
>>299
>>303
そのとうりですすいません……

305:デフォルトの名無しさん
07/12/13 11:07:28
>>268-304
この辺からおかしくなってきてる

306:デフォルトの名無しさん
07/12/13 11:49:46
なんにしてもHaskellerが増えるのは喜ばしいことだ

307:デフォルトの名無しさん
07/12/13 11:51:12
rubyみたいになるぐらいなら少なくてもいい

308:デフォルトの名無しさん
07/12/13 16:58:02
少数精鋭投入ならこれでいいだろうけど
大人数投入用にコードもデータもブラックボックスにできる仕組み(命令型のオブジェクト指向同等?)誰か作らないのかな

309:デフォルトの名無しさん
07/12/13 17:07:09
大人数投入っていまどき流行らないよ
人海戦術でプログラミングする時代は終わった

310:デフォルトの名無しさん
07/12/13 17:23:49
>>308
ブラックボックス化ってどんなの?
カプセル化なら標準のモジュールシステムがあるけど

311:デフォルトの名無しさん
07/12/13 17:28:42
>>308
そんなにオブジェクト指向がやりたいなら
つ O'Haskell

312:デフォルトの名無しさん
07/12/13 17:30:17
でも、そもそもオブジェクト指向は型理論に包含されるものだから・・・

313:デフォルトの名無しさん
07/12/13 17:31:50
デバドラ屋と少数のhaskellerがいればたいていのプロジェクトは成功する
・・・夢を見た

314:デフォルトの名無しさん
07/12/13 18:14:01
>>308
そもそもhaskellにはオブジェクト指向は不要なんですよ。
というのも、関数の再利用できる範囲がCやらjavaやらとは桁違いに大きいのが特徴だからです。


315:デフォルトの名無しさん
07/12/13 21:20:25
Haskellでモジュールつかってカプセル化してコード書いている人あまりいないような気がするんだけど気のせいかな。


316:デフォルトの名無しさん
07/12/13 21:22:03
なにを根拠に?

317:デフォルトの名無しさん
07/12/13 21:35:09
>>315
そもそもhaskellを使って実用アプリを公開してる人があんまりいないんだから
仕方ないだろ。

318:デフォルトの名無しさん
07/12/13 22:49:47
Haskellって関数型言語の勉強用じゃないの?

319:デフォルトの名無しさん
07/12/13 23:10:30
それだけのための言語だとどうして思うのですか?

320:デフォルトの名無しさん
07/12/14 00:39:15
GHC 6.8.2が出てるね。
GHCiの機能追加がメインっぽい。

321:デフォルトの名無しさん
07/12/14 00:53:25
HaskellはOOじゃなくて、
generic programing指向だからなあ。
Genericsの世界では最強認定を受けてる。

322:デフォルトの名無しさん
07/12/14 01:21:07
OfficeがHaskellで書きなおされるまで俺はその有用性を認めない。

323:デフォルトの名無しさん
07/12/14 02:29:17
スケーリングのための言語じゃないんだよな
工場制手工業ならOOであることやポピュラリティ(みんなが使ってること)は必須だ。

324:デフォルトの名無しさん
07/12/14 13:26:48
別に必須じゃないし。
今流行ってること取り入れたってどうせちぐはぐになるだけ。

325:デフォルトの名無しさん
07/12/14 13:28:05
っていうかさ、人海戦術の奴隷商売に慣れすぎていて、理性的な考え方を失ったお猿さんですか?

326:デフォルトの名無しさん
07/12/14 14:15:06
ポピュラリティが必須というのは分かるけど、OOが必須というのはおかしくね?
OOは一手法に過ぎないんだから、もっと良いものが知られればそっちが使われるようになるだろ

327:デフォルトの名無しさん
07/12/14 14:21:57
OOは現時点でのポピュラリティの1つって事ならわからなくもないけど、
わざわざ分けて必須って言うほどのものではないな。

328:デフォルトの名無しさん
07/12/14 14:54:59
つーか、OOはstableなlibrary構築にはいいんだけど、
意外とreusabilityが悪いから、
generic programmingが注目されているのが現状です。
Haskellのtype classとかC++のconceptみたいなやつ。

C++はtemplate/traitsでやってましたが、ちょっと非力なので、
Haskellのtype classそっくりの"concept"が入る事になりました。


329:デフォルトの名無しさん
07/12/14 14:59:18
実際これはOOと比べてどうなんだとか思ってたんだけど
実際使ってみたら意外とオブジェクト指向のメリット包含しててSUGEEとか思った

330:デフォルトの名無しさん
07/12/14 14:59:57
>>328
日本語でおk

331:328
07/12/14 15:35:51
日本語ですよ?

332:デフォルトの名無しさん
07/12/14 15:45:42
決して英語が読めないわけではないが、
不自然だ
読みにくい
目が痛い

333:デフォルトの名無しさん
07/12/14 16:23:51
理論はそのとおりなんだが、残念だがそんな理論を理解出来る人間は少数派なんだよ。
共産主義みたいなもん。高尚な理屈よりも明日パンが、今日のバグを潰せるかが問題なわけだ。

いいじゃない。Haskellは芸術的な小物を個人で作るのに向いてるってことで。



334:デフォルトの名無しさん
07/12/14 17:07:50
>>333
多数のバカよりも少数の優秀な人間でプログラミングしたほうが安く早くできます。

335:328
07/12/14 17:08:28
>>332
そういう意味か。すまん

>>328については、
URLリンク(journals.cambridge.org)
で。探せばピィーディーエフも見つかるようです。

336:デフォルトの名無しさん
07/12/14 17:09:42
>>333
どの辺の理論のことを言ってるの?

337:デフォルトの名無しさん
07/12/14 17:10:46
>>335
不自然だ
読みにくい
目が痛い

お前は日本語文書の常識を勉強したほうがよさそうだな

338:デフォルトの名無しさん
07/12/14 17:16:49
どっちにしろ、今みたいに人気がなくて、そのせいでライブラリも
周辺環境も整っていない状況だと、小物を個人で作るのすら満足にできん。

339:デフォルトの名無しさん
07/12/14 17:43:43
wxhaskellが使いやすい
が、6.8系用が出てない・・6.6系は非公式

340:デフォルトの名無しさん
07/12/14 17:52:21
いまだと.NETやJavaVMに乗せちゃえばライブラリ不足は一挙に解決だな。

341:デフォルトの名無しさん
07/12/14 17:56:18
>>339
普通にdarcs版をビルドできないか?

342:デフォルトの名無しさん
07/12/14 17:56:46
>>340
なんで?

343:デフォルトの名無しさん
07/12/14 19:53:13
conceptの導入をもってHaskellはC++のサブセットになります
つまりこれで全ての言語がC++のサブセットになるというわけです

344:デフォルトの名無しさん
07/12/14 20:54:45
本日をもってHaskellはウジ虫を卒業する
本日からHaskellはC++のサブセットである
兄弟の絆に結ばれる
Haskellのくたばるその日まで
どこにいようとC++は貴様らの兄弟だ
多くはベトナムへ向かう
ある者は二度と戻らない
だが肝に銘じておけ
C++は死ぬ
死ぬために我々は存在する
だがC++は永遠である
つまり――Haskellも永遠である!

345:デフォルトの名無しさん
07/12/15 07:46:00
初心者質問です。

test = flip fun1 . fun2

の場合、

1. test = flip (fun1 . fun2)

2. test = flip (fun1) . fun2

どっちの意味なんでしょうか。(.)が使用されている場合、flipが対象とする
関数がどこまでかかるか分かんなくなってしまいました。

346:デフォルトの名無しさん
07/12/15 08:05:18
(.)よりも関数適用のほうが優先度が高いから答えは一応 2.なんだけど、
括弧の付け方としては (flip fun1) . fun2 のほうが正しい。

347:345
07/12/15 14:13:25
>>346
ありがとうございます。合成関数全体にかかるのかと思ってました。
もう少しいいでしょうか。

URLリンク(ja.doukaku.org)

にある、

attachIndex = map (uncurry (flip zipWith [0..] . ((,) .) . flip (,))) . zip [0..]

がよく理解できないのですが、

(flip zipWith [0..] . ((,) .) . flip (,)) 0 "abc"

の部分は

zipWith (((,) .) $ flip (,) 0) [0..] "abc"

と考えられると思うのですが、何ででしょうか。(flip zipWith [0..] . ((,) .) . flip (,)) の
第一引数"0"がまず部分適応されてflipされるところが理解できません。


348:デフォルトの名無しさん
07/12/15 14:41:26
(flip zipWith [0..] . ((,) .) . flip (,)) 0
から始める。まずこの式は(A . B . C) 0という形だからA (B $ C 0)に直せて、
flip zipWith [0..] ( ((,) .) $ flip (,) 0 )
これはflip A B Cという形だからA C Bと書き換えられて、
zipWith ( ((,) .) $ flip (,) 0) [0..]

349:345
07/12/15 15:29:30
>>348
ありがとうございます。しかし、まだちょっと理解できませんw

1.第一引数"0"の部分適応を行う
2.flip する

の順番の根拠がよく分かりません。

(flip zipWith [0..] . ((,) .) . flip (,)) 0 "abc"

の第二引数が最後に適応されるのは何故でしょうか。

あと、これは変な質問なんですけど、

(flip zipWith [0..] . ((,) .) . flip (,)) 0 "abc"

の形を慣れた方は直接記述できちゃうんでしょうか。それとも、

zipWith ( ((,) .) $ flip (,) 0) [0..] "abc"

の形から変形させていく形でプログラム書いていくんでしょうか。


350:デフォルトの名無しさん
07/12/15 15:37:45
>>349
Haskellでは基本的にどんな順番で簡約しても結果は同じだから、分かりやすい順序でやっただけ。
もっと実装に即した順序でやることもできるけど、面倒なだけな気がする。

>の形を慣れた方は直接記述できちゃうんでしょうか。
俺はできない。読むのも二分くらい掛かった。

351:デフォルトの名無しさん
07/12/15 15:42:07
あ、でもそのnobsunという人は日常的にそういうコードを書いてるみたいだから、
たぶんすらすら書けるんだろう。

352:デフォルトの名無しさん
07/12/15 15:46:11
俺思うんだけどさ、デザインパターン中毒みたいにポイントフリー中毒ってあるんじゃないかなあ。
そーいうのって可読性犠牲にしてまでやるものなのか?

353:デフォルトの名無しさん
07/12/15 15:47:28
>>350
> Haskellでは基本的にどんな順番で簡約しても結果は同じだから、分かりやすい順序でやっただけ。

(flip zipWith [0..] . ((,) .) . flip (,)) 0 "abc"

自分がどうも腑に落ちないのは、どうして

zipWith ( ((,) .) $ flip (,) 0 "abc") [0..]

こうじゃないんだろう?ってとこなんですね。もちろん、こういう解釈だとダメなんですけど、
引数一つだけ取って、ある関数を返してから、次に行くってのがルールだったりするのかな、
と思ったのですが。

> 俺はできない。読むのも二分くらい掛かった。

そうですかw。いや、直感的に書ける人って凄いなぁって思ったんですが、なかなか
そういう人はいないんでしょうかね。

354:デフォルトの名無しさん
07/12/15 16:02:39
>>352
デザインパターン中毒はどうか知らんが、この書きかたには
記述が簡潔になるという利点があるんだから、別にいいんじゃないかと思う。

>>353
Haskellの関数は常に一引数関数で、多引数関数は
カリー化でエミュレートされているだけだということを思い出すべし。
(.)も両辺を一引数関数として合成するから、
(f . g) a b

f (g a b)
は等しくない。

355:デフォルトの名無しさん
07/12/15 16:05:04
些細なことだけど
> (f . g) a b
この括弧なんとかならないかな

356:デフォルトの名無しさん
07/12/15 16:13:51
>>354
> Haskellの関数は常に一引数関数で、多引数関数は
> カリー化でエミュレートされているだけだということを思い出すべし。

そうでしたw。

いやぁ、ありがとうございます。スッキリしました。

357:デフォルトの名無しさん
07/12/15 16:36:06
>>355
>219に戻れ

358:デフォルトの名無しさん
07/12/15 16:43:36
>>357
>>219とは趣旨が違う
> (f . g) a b
この括弧はうっとうしいなぁと言ってるだけなんだよ。
$みたいに括弧省略したい

359:デフォルトの名無しさん
07/12/15 17:10:55
俺はその格好が好きだ

360:デフォルトの名無しさん
07/12/15 17:31:40
ML でも (foo o bar o baz o foobar) quux みたいに書くね

361:デフォルトの名無しさん
07/12/15 20:25:33
>>358
お前は何を言っているんだ

362:デフォルトの名無しさん
07/12/15 21:14:46
>>361
心で感じろ

363:デフォルトの名無しさん
07/12/16 01:37:28
>>361
風を感じろ

364:デフォルトの名無しさん
07/12/16 01:45:32
GHC 6.8.2 Windows版で、コンソールのコードページが英語のになるバグがようやく直ったな。

365:デフォルトの名無しさん
07/12/16 20:36:29
Parallel Haskellの拡張されてる点ってどんなとこ?

366:デフォルトの名無しさん
07/12/17 08:39:00
>>364
太字になるのは?

367:デフォルトの名無しさん
07/12/17 09:27:14
WindowsでGHCなんか使うやつはバカです

368:デフォルトの名無しさん
07/12/17 11:39:39
同感

369:デフォルトの名無しさん
07/12/17 11:47:31
windowsではGHC以外に何が一番いいの?

370:デフォルトの名無しさん
07/12/17 16:08:40
>>365
(疎結合の)クラスタ範囲にまで並列化する
(普通のマルチコア・マルチCPU(どっちも共有メモリ)範囲の(半)自動並列化ならGHC本体だけでもできる)
そんなハード持ってなければどっちみち関係ない

371:デフォルトの名無しさん
07/12/17 22:55:51
        ____
       /      \
      /  ─    ─\     今年もあと一ヶ月だお・・・
    /    (●)  (●) \
    |       (__人__)    | ________
     \        ̄    ./ .| |          |
    ノ           \ | |          |
  /´                 | |          |
 |    l                | |          |
 ヽ    -一ー_~、⌒)^),-、   | |_________|
  ヽ ____,ノγ⌒ヽ)ニニ- ̄   | |  |




      / ̄ ̄ ̄\
    / ─    ─ \
   /  (●)  (●)  \.  俺はこの一年間何をしていたんだろう
   |    (__人__)    | 2chで浪費した莫大な時間を何か有意義なことに使っていたら・・・
   \    ` ⌒´    /
   /           \

372:デフォルトの名無しさん
07/12/17 23:18:53
このスレは相当に有意義だと思うんだけどな。
つうか基本的に専門スレしか見ない人も多いと思うんだが。
今年も大変勉強になりました。

373:デフォルトの名無しさん
07/12/22 18:46:23
いまさらだが、

>>96
JavaScriptでもできるな

374:デフォルトの名無しさん
07/12/22 20:49:40
(>>=´∀`)

375:デフォルトの名無しさん
07/12/22 23:20:06
そこで具体的な事じゃなく漠然と「有意義な事」って言葉しか出ないなら
2ちゃんやらなくても結果は一緒だったと思うんだよ

376:デフォルトの名無しさん
07/12/23 00:04:51
日頃から頑迷そうな意見乙

377:デフォルトの名無しさん
07/12/24 12:55:59
哲板から転載
読んだ人いる?

圏論による論理学 高階論理とトポス

清水 義夫
ISBN978-4-13-012057-9,
発売日:2007年12月中旬,
判型:A5, 232頁


内容紹介
20世紀後半,数学,計算機科学,論理学などの分野で採用されてきている圏論.
関数概念を基本として現象をとらえようというこの方法を,
関数型高階論理とトポスを題材にして丁寧に解説する.
論理学の観点を中心に,圏論の考え方を紹介するテキスト.



主要目次

第1章 関数型高階論理
第2章 トポス
第3章 トポスの基本定理
第4章 プルバック関手f *の右-随伴関与Πf
第5章 リミット、空間性トポス、限定記号
結び
付録1 A∧( ) ┤A⊃( )のイメージ的理解
付録2 各章の課題
主な記号一覧/索引


378:デフォルトの名無しさん
07/12/24 12:57:43
>>377
立ち読みしたが、俺らには全く関係ないよ

379:デフォルトの名無しさん
07/12/24 12:59:29
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●不合格●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
これを見た人は確実に【不合格】です。これをコピペでどこかに1回貼れば回避できます。
これは本当です。やらないと一年無駄になります.

私も最初は嘘だと思ったんですが、一応コピペしました。それで第一志望に合格出来ました。
けどコピペしなかった友達がA判定とっていたのに、おちたんです。(慶応合格h.sさん)

俺はもうE判定で記念受験だったんだけど、コピペを10回くらいした途端に過去問が
スラスラ解けるようになって、なんと念願の開成に受かりました。(開成合格r.kくん)

これを今年の試験前に見てシカトしたら、入試でミスって最悪です。(n.aさん)

380:デフォルトの名無しさん
07/12/24 16:34:29
tasukete

381:デフォルトの名無しさん
07/12/24 16:37:43
>>380
通報しますた

382:デフォルトの名無しさん
07/12/25 08:38:38
>>378
関係ないことないだろ。
Haskellの型システムを理論的に理解する時など。

383:デフォルトの名無しさん
07/12/25 08:51:28
しみろん、懐かしいな…

384:デフォルトの名無しさん
07/12/25 11:43:56
すげー久しぶりに しみろん 見た…

385:デフォルトの名無しさん
07/12/26 19:57:10
liftM と fmap が一致しない場合ってあるの?

386:デフォルトの名無しさん
07/12/26 21:11:49
>383-384
東大OB乙

387:デフォルトの名無しさん
07/12/28 18:50:21
二ヶ月ほど前に撮った写真です
場所はバトルロワイヤルの撮影地にもなった
軍艦島での一枚です。
URLリンク(www.uploda.net)
撮影し現像した物を
心霊写真がないかな〜っと面白半分で探していると
偶然にも一枚だけ物凄い写真が在りました
最初に見えたのは右下の子供の様な顔です
左にはボーっと立ち尽くし
こっちを見ている子供がうっすらと写っています
上部には青白い叫び顔があります
それだけではありません
探せば探すほど気持ち悪い顔があるのです
私は現在で約30ほどの顔を見つけました、全てこっちを見ています
探せば探すほどあまりにも出てくるので
気持ち悪くなり頭が痛くなりました
この写真ですが、ある友人に貸した所
夜に1時間程笑い声の様なものが聞こえてかなり
怖かったらしいです・・・
霊感がある方はぜひ鑑定をお願い致します。

因みに、スキャナーで高画質でスキャンした上で
見易いように画質調整をしています
ですのでファイルサイズが9MBにもなります・・・

388:デフォルトの名無しさん
07/12/28 21:23:54
>>387
スレ違い

画像処理 その10
スレリンク(tech板)

389:デフォルトの名無しさん
07/12/29 00:40:56
ワロタ

390:デフォルトの名無しさん
07/12/31 18:01:51
初心者レスです。
既出や意味不明な質問でしたらすみません。

ポイントフリースタイルって言葉がありますよね。
仮引数を無くして、関数を関数だけで定義するという意味で。

firstNLines n cs = (unlines . take n . lines) cs

上のような関数が定義されていたとして、
仮引数を減らす仮定で

firstNLines n = unlines . take n . lines

上のように書けますよね。
更に仮引数 n を無くす場合

firstNLines = (. lines) . (unlines .) . take

と書けると思うんですが
ポイントフリースタイルとなった最後の定義式を見て
理解しやすくなったとは思えないのです。
積極的に使うべきなのでしょうか。

391:デフォルトの名無しさん
07/12/31 18:07:32
わかりやすいほうでいいんじゃない?
ごちゃごちゃしてるのがいやならポイントフリーで。

392:デフォルトの名無しさん
07/12/31 19:15:14
なんでもポイントフリーにするのは難読化への道を歩んでしまいかねん。
とりあえず二つ目のfirstNLines nみたいに普通に使ううちは
型を明示してれば分かりにくくなることも無いけど、
度を過ぎた奴はコードの修正とかも考えると扱いにくいわ読みにくいわでいろいろと面倒だし、
ポイントフリースタイルが時にはポイントレス(要領の悪い)スタイルといわれることもある

ってHaskellWikiに書いてた
俺もflipとかドットとか使いまくったコードを読むのは嫌い。
でも書いてる奴からするとパズルみたいで楽しいんだろうなあ、とか。

393:389
07/12/31 19:29:48
ポイントレススタイル・・・。
書くときは頭の体操になるかもしれませんが
読む方からすると大変ですよね。

394:デフォルトの名無しさん
07/12/31 21:34:10
ポイントフリースタイルにすると点 . がどんどん増えてぜんぜんポイントフリーじゃないよ(笑

395:デフォルトの名無しさん
07/12/31 22:03:28
map ($ 3) [(+1),((-)2),(/3),(*4)] とか書くと単純なことなのになんか愉快だよね、たしかに

396:デフォルトの名無しさん
07/12/31 23:38:55
なんだその記号だらけの読みにくい奇怪なコードは

397:デフォルトの名無しさん
08/01/01 00:16:55
あけましておめでとうございます。
今年は Haskeller になれるように頑張りまふ(`・ω・´)!!

398:デフォルトの名無しさん
08/01/01 10:27:49
俺もだ!
今年こそはHaskellマスターになる

399:デフォルトの名無しさん
08/01/01 11:08:26
>>395
少し愉快になれた(゚∀゚)

400:デフォルトの名無しさん
08/01/01 17:35:39
今更だけど
>>52
の説明に感動した。

401:デフォルトの名無しさん
08/01/01 18:08:19
>>394
ポイントって確か関数合成演算子じゃなくて「値」のことだったかと
まあそれを踏まえて言ってるのかもしれないけど

402:デフォルトの名無しさん
08/01/09 00:26:20
モナド難しいよ。
みんなエディタは何使ってる?
Emacs が多いのかな。

403:デフォルトの名無しさん
08/01/09 00:50:16
現状まともにプログラミングできる環境がemacsしかない
eclipseは使いづらいし、xyzzyのhaskell-modeはバグだらけだしwindowsでしか動かないし。

404:デフォルトの名無しさん
08/01/09 00:52:19
>>402
モナドなんてHaskellではただのデータ型なんだから、別に難しいことなんかないよ。

405:デフォルトの名無しさん
08/01/09 09:01:44
>>403
vim にもあるでしょ?俺は vim 使ってるよ

406:デフォルトの名無しさん
08/01/09 11:04:47
俺は、viはほとんど使えないんだ。
設定ファイルをちょこっと編集するぐらいなら使うが、深い使い方は覚えてない。

407:デフォルトの名無しさん
08/01/09 15:34:50
>>401
ここに由来が書いてあります。
URLリンク(www.haskell.org)

408:デフォルトの名無しさん
08/01/09 17:39:13
darcs2って今までのdarcsとどう違うの

haskellの組み込み言語atomを詳しくおしえて

409:デフォルトの名無しさん
08/01/11 18:22:16
関数型初心者です。

今、SICPを少しずつ読んでるのですが、set!のようなものをHaskellがモナド化するのは
単に純粋であることに拘るからでしょうか。IORefみたいなものがset!に当たるかと思います
が、副作用アリだぞ、ということを意識させる以上のメリットとかがよく分かりません。



410:デフォルトの名無しさん
08/01/11 20:10:23
>>409
プログラマに直接メリットはない。

メリットは最適化コンパイラを作るのが楽になること。

411:デフォルトの名無しさん
08/01/12 04:05:03
関数型言語をやる人の多くは、学生も含め研究者です。
研究テーマはプログラミング言語の中でも、
意味論やプログラム解析などが多く、
そういう研究では参照の透明性が非常に有益な性質です。

たとえば、Javaで盛んに研究されているエスケープ解析も、
初期の成果では、関数型言語で行われたものが多いです。

また参照の透明性を保つことは、実務プログラマにとっても大変有益で、
プログラムの簡明さを保つことにつながります。
良く理解すれば、他の言語でも使える一つの方法論を得たことになります。

412:デフォルトの名無しさん
08/01/12 04:32:28
C99のコンパイラ作ってくれ。

413:デフォルトの名無しさん
08/01/12 04:33:24
インタープリタで頼む。CなのにGCがオプションであったりとか。

414:デフォルトの名無しさん
08/01/12 08:18:04
CINTがあるじゃないか

現状どうなってるか全く知らないけど

415:デフォルトの名無しさん
08/01/12 09:06:52
>>410-411
そんな小難しい話しなくても、評価順の決まっていない言語で副作用を使うのが
どれだけ厄介か考えれば済むことじゃないか?

416:デフォルトの名無しさん
08/01/12 09:42:37
>>409
確かに純粋であることに拘っているからという点は大きい。
しかし、それだけではなく、例えば、
Haskellではリストを使ったプログラムを書いている途中でそれを非決定性計算と
みなしてプログラムの一部を書くとか、IOに限らずモナドを気軽に使う人もいる。
そのためモナド一般を扱う便利関数(mapMとかモナド変換子とか)が多く用意されている。
IOがモナドになっているとそういった便利関数が使えるので便利。


また、モナドになっていると読みやすさのためにコードをまとめたり
移動させたりといった操作が気軽にできる。
例えば副作用のある言語で

f x = x + y + (副作用のある式)
where
y = (副作用のある式)

とかやるとどの順番で副作用が現れるかとか、yはどのタイミングで
何回評価されるのかわからない。
Haskellであればそのような問題はないので気軽にwhereにコードを
まとめたりできる。


417:409
08/01/12 11:02:27
皆さん、ご回答ありがとうございます。

>>415
そうなんですが、モナドはdo記法が可能で、これは実質手続き型の
記述ですよね。手続き型の記述が関数型言語内で可能だから、IOが
モナドになっていると思うのです。

>>416
モナド自体は演算のリレーということで分かるんですが、副作用の発生
する式をそうする理由は、上に書いたように、単に順番が保証されるのが
モナドである、という以上の理由は無い気がします。

どちらかというと、>>410さんの書いていることがメインなのでしょうかね。




418:デフォルトの名無しさん
08/01/12 12:10:33
モナドのおかげで、
CやSchemeよりコンパイラの最適化がより進むって事はないんで、
そこのところは誤解しないように。

参照の透明性から、プログラム変換しやすくなるので、
コンパイラの研究がやりやすいってだけ。


419:デフォルトの名無しさん
08/01/12 12:10:54
>>417
>単に順番が保証されるのがモナドである
違う。遅延処理ではg . f(x)でf → gと簡約されるかどうかがわからないのと同じように
¥x -> mf >>= mg でmf → mgと簡約されるかどうかはわからない。

モナド自体には「計算のリレー」の意味はあるけど「順番に実行する」意味はない。
IOモナドみたいな奴は、計算のリレーが示すその一連のIOアクションがmainに渡されたときに
(遅延しないHaskell処理系が)順番に実行することで「順次実行」を実現している。

IOがモナドになっているのは「計算がリレーの形になっている」ことを保障させるためだけ。

UnsafeInterleaveIOはIOモナドから出してすぐ入れるだけの処理だけどIOアクションが遅延するようになる。
これは計算のリレーを途中で切断したからその部分だけ順次実行できなくなったんだね。
これを使ってる関数にはgetContentsやinterleaveとかがある。


420:デフォルトの名無しさん
08/01/12 14:57:58
前に読んだことがある論文で、
HaskellのIOの実装に関する論文なんだが、
タイトルを忘れてしまった。
それらしい論文のタイトルを挙げてくれませんか?

421:デフォルトの名無しさん
08/01/12 15:08:02
俺はsimonpjのこれが面白かった。
Tackling the awkward squad:
monadic input/output, concurrency, exceptions, and foreign-language calls in Haskell
URLリンク(research.microsoft.com)

422:デフォルトの名無しさん
08/01/12 17:23:16
>>421
これだこれだ
ありがとう

423:421
08/01/12 18:09:21
うぉー、一発的中!
ご褒美に最近読んで面白かったHaskell論文のタイトルくれ

424:デフォルトの名無しさん
08/01/14 02:35:49
URLリンク(web.yl.is.s.u-tokyo.ac.jp)
これに書かれてる、
> Ericssonによる 電話のソフトウェアを用いた一連の実験によれば、9から25倍の向上が 見られました
の部分の根拠となる論文って何?

425:デフォルトの名無しさん
08/01/14 12:27:39
2組のタプルの値を交換する関数って
標準でありますか?

exTuple (x,y) = (y,x)

みたいな感じの。無いならいいんですが・・・。

426:デフォルトの名無しさん
08/01/14 13:26:01
無いと思う。強いて言えばuncurry (flip (,))だけど。

427:デフォルトの名無しさん
08/01/14 13:39:28
なるほど uncurry ですか。
flip (,) までは考えてたんですが

ありがとうございます。

428:デフォルトの名無しさん
08/01/14 15:15:28
十進数 (e.g. [1,2]) を二進数 (e.g. [1,1,0,0]) に変換するプログラムを,
foldl を用いて書け,という問題を連休中ずっと考えてるんですが,
脳味噌が手続き型で凝り固まっていてさっぱりわかりません.

どうやって書くのか教えて頂けませんか.

429:デフォルトの名無しさん
08/01/14 15:19:02
手続き的になら書けるの?

430:デフォルトの名無しさん
08/01/14 15:26:32
教科書的に書こうとしてみたが、こんなんでいいか?
import List

-- n進数表示から整数へ
fromBaseN :: Integer -> [Integer] -> Integer
fromBaseN n ds = foldl f 0 ds
  where
    f acc d = n * acc + d

-- 整数からn進数表示へ
toBaseN :: Integer -> Integer -> [Integer]
toBaseN n 0 = [0]
toBaseN n x = reverse $ unfoldr f x
  where
    f 0 = Nothing
    f x = Just (mod x n, div x n)

-- 十進数から二進数へ
decToBin :: [Integer] -> [Integer]
decToBin = toBaseN 2 . fromBaseN 10

431:デフォルトの名無しさん
08/01/14 15:30:33
>>430
教科書的なら一発でできる方法があるはずだ

432:デフォルトの名無しさん
08/01/14 20:10:49
>>431
mjd?

433:デフォルトの名無しさん
08/01/14 20:36:34
ghc6.6のころはSystem.Console.Readlineってデフォルトではいってましたよね?
当方Windowsなんですが、
久しぶりにHaskellやろうと思って6.8.2をインストールしたんだけどSystem.Console.Readlineがない・・
一年くらい前につくったインタプリタがビルドできないっす;;
にわかなのでライブラリインストールもままならないのですが、cabal-installってWindowsでも使えますでしょうか?

434:デフォルトの名無しさん
08/01/14 21:05:11
n進数→十進数をfoldlでやるならわかるけど
その逆は思いつかんなあ

435:デフォルトの名無しさん
08/01/14 22:12:17
なつめって初めて知ったけど、こんな所にも Haskell を使ってる人が居るとは面白い

URLリンク(natume.sourceforge.jp)

436:デフォルトの名無しさん
08/01/15 00:17:04
重すぎて使い物にならないけどな

437:デフォルトの名無しさん
08/01/15 00:29:35
>>433
Haskellプログラム書くならHaskell98に準拠しないと互換性なくなるぜ?

438:デフォルトの名無しさん
08/01/15 00:30:28
どなたか>>424の質問の返答をおねがいします

439:デフォルトの名無しさん
08/01/15 03:18:49
>>430
428 では無いんだが

Just (mod x n, div x n)

ここって modDiv 使った方が速いのか?
そうすると >>425 みたいなのを使うべき?

440:デフォルトの名無しさん
08/01/15 03:19:50
modDiv -> divMod
だった。ごめん。

441:デフォルトの名無しさん
08/01/16 00:40:44
>>439
divMod 使う方が速いんじゃないかな。
かといって>>425は読みにくいから
Just (r,q) where (q,r) = divMod x n
でいいんじゃない。

442:デフォルトの名無しさん
08/01/16 06:56:19
なるほど、サンクス。

443:デフォルトの名無しさん
08/01/16 11:52:42
数が小さいと分かっている時: (なおかつ実行効率が必要なら)
modとdivの計算コストは小さいから、
タプルを消費しないように書いた方がいい。

444:430
08/01/16 13:48:57
実行効率なんて全然考えてなかったよ
とりあえず実測してみた。ghc-6.8.2 -O2、入力はrandomRIO (0, 2^16)で

19.6 19.2 toBaseN
14.2 14.6 toBaseN_where
12.6 13.1 toBaseN_loop
8.6 10.8 toBaseN_case
7.9 7.0 toBaseN_loop_case

左から、%time、%alloc、関数名。_whereは>>441のやりかた。_caseはwhere節の代わりにcase式を使ったもの
_loopはreverse+unfoldrの代わりに手でループ(末尾再帰)を書いたもの
総実行時間の約1/4がGCだった

数が小さくてもdivとmodのコストが大きいな

445:デフォルトの名無しさん
08/01/16 17:30:40
無知でスマソ
末尾再帰ってことは $! を使ってるってこと?
良ければソースを見せて貰えませんか。

446:デフォルトの名無しさん
08/01/16 19:00:45
>>445
なぜか$!に慣れないのでseqを使ってるけど

toBaseN_loop_case :: Integer -> Integer -> [Integer]
toBaseN_loop_case n 0 = [0]
toBaseN_loop_case n x = f x []
  where
    f 0 ds = ds
    f x ds = case divMod x n of
      (r, q) -> f r (q:ds)

toBaseN_loop :: Integer -> Integer -> [Integer]
toBaseN_loop n 0 = [0]
toBaseN_loop n x = f x []
  where
    f 0 ds = ds
    f x ds = let q = div x n; r = div x n in
      q `seq` r `seq` f r (q:ds)

447:デフォルトの名無しさん
08/01/16 19:22:34
今気付いたけど、toBaseN_loopのdivは片方modじゃないといかんな
そういうわけで>>444の結果は間違ってる

448:デフォルトの名無しさん
08/01/17 19:16:16
たかだか有限時間で終わる処理について実行効率など考える必要はない

449:デフォルトの名無しさん
08/01/17 19:17:04
神様キター!

450:デフォルトの名無しさん
08/01/17 21:31:07
>>448
人間が不快に感じるかどうかなんて些細な問題だよな

451:デフォルトの名無しさん
08/01/17 22:19:48
だったら数学やっててくれ。

452:デフォルトの名無しさん
08/01/18 00:05:36
>>448
512ビットの素因数分解だって有限時間でできますよ。

453:デフォルトの名無しさん
08/01/19 03:21:02
>>448
お前の人生も有限時間で終わるぜ

454:デフォルトの名無しさん
08/01/19 10:02:31
この宇宙は有限時間で終わりますか?

455:デフォルトの名無しさん
08/01/19 18:40:07
どなたか
State モナドの使い方を
教えて貰えませんか?

456:デフォルトの名無しさん
08/01/19 18:58:23
使いどころが知りたいのか書きかたが知りたいのか

457:デフォルトの名無しさん
08/01/19 19:20:13
>>455
例が腐るほどWEB上にあるだろ
検索してみろよ

458:デフォルトの名無しさん
08/01/19 19:22:47
使いどころです。

459:デフォルトの名無しさん
08/01/19 19:34:18
>>458
入門書に載ってた例だけど、

・文字列を要素とする二分木が与えられたとき、その要素を整数に置換した木を得たい。
ただし同じ文字列は同じ整数に対応させること。例えば、


460:459
08/01/19 19:40:19
途中送信御免

例えば、
(("hoge") "hage" (("fuga") "hage" ("fuga")))
という木なら
((0) 1 ((2) 1 (2)))
にする。

手続き型言語なら、実行した置換を記録しながら木を左から走査していけば良いわけだが、
Stateモナドを使えばHaskellでも同様に書ける。逆にStateモナドを使わずに写像を引き回すのは面倒。

461:デフォルトの名無しさん
08/01/19 21:49:50
広範囲で変数を持ちまわるのに
普通の言語ではグローバル変数とかインスタンス変数に書き込んだりするけど、
そんなどこで変更されるかわからないようなアブナイことしなくても
(a,s) -> (b,s)の形で持ちまわればいいよね、ってのがStateモナドなんだから、
普通は変数を使う処理を考えればおのずから例はでてくるんじゃないか?

462:デフォルトの名無しさん
08/01/20 08:17:57
>>461
「普通は変数を使う処理」の大部分はHaskellでStateモナドを使わずに綺麗に書ける。
だから混乱するんだと思うが。

463:デフォルトの名無しさん
08/01/20 19:37:59
>>460
禿言うなヽ(`Д´)ノ

464:デフォルトの名無しさん
08/01/20 20:55:16
>>460
hageにも人権をヽ(`Д´)ノ

465:デフォルトの名無しさん
08/01/22 10:36:58
(("nukege") "usuge" (("fuga") "usuge" ("fuga")))

466:デフォルトの名無しさん
08/01/23 15:17:31
オセロとか将棋とかの盤面のデータ構造についていつも迷うんだが、
いったいどういうデータ構造にするのが一番効率がいいのかね
2次元リストとか、Mapとか、いろいろあると思うが・・・

467:デフォルトの名無しさん
08/01/23 15:44:00
>>466
よく使われるのは1次元配列とbit board

468:デフォルトの名無しさん
08/01/24 12:50:26
ByteStringでのParsec実装が欲しいっす。

469:デフォルトの名無しさん
08/01/24 19:11:50
そういえばParsecがどうやって実装されてるか知らない
ソース見てみたけど何か難しそうだ

470:デフォルトの名無しさん
08/01/24 23:03:19
普通にモナドじゃないの?

471:デフォルトの名無しさん
08/01/29 13:51:05
log4*的なロガーライブラリってないでしょうか?

472:デフォルトの名無しさん
08/01/29 13:58:35
>>471
実際に使ったことはないけど
URLリンク(hackage.haskell.org)

473:デフォルトの名無しさん
08/01/29 14:11:30
>>472
おお!ありがとうございます。
試してみます

474:デフォルトの名無しさん
08/01/30 15:37:30
質問です。

C言語で
int hoge(void) {
int x,i;
for(x=0, i=0; i<100000; i++) {
x=x+i;
}
return x;
}
をHaskellで書く場合は再帰で書くほうが良いのか、foldlで書くほうが良いのか分かりません。
他にも書き方があるかもしれませんが、一番メジャーなループの書き方を教えてください。

475:デフォルトの名無しさん
08/01/30 16:03:59
まるで最低一種類は自力で書けるかのような言い方だな

476:デフォルトの名無しさん
08/01/30 16:09:44
どんな場合にも一番いい方法が存在するかのような言い方だな

477:デフォルトの名無しさん
08/01/30 16:16:33
>>474
俺は、再帰でない書き方をすぐに思い付かなかったときだけ再帰を使ってる
その例なら迷わずsum [0..100000]だな

478:474
08/01/30 16:19:09
>>477
ありがとうございます。
その場合、リストはどのように処理されるのでしょう?
つまり、1000番目の要素を足しているときに、999番以下の要素はもはや必要ないわけですけれど、
sum関数が終了するまでメモリに記憶されているのでしょうか?

479:デフォルトの名無しさん
08/01/30 16:29:10
>>478
どこからも参照されていないから、いつでもGCされうる状態
実際にメモリ上に残っているかどうかはGCのタイミング次第

480:474
08/01/30 16:34:17
>>479
ありがとうございます。
では逆に1000番目の要素を足しているときに、1001番目の要素はすでに生成されているのでしょうか?
足す直前に生成されるのでしょうか?

481:デフォルトの名無しさん
08/01/30 16:50:17
>>480
> 1001番目の要素
とはどういうものを意識してる?具体的にkwsk

482:デフォルトの名無しさん
08/01/30 16:52:05
>>480
処理系と最適化オプションに依る

素朴な遅延評価だと前者
sum [0..100000]
==> foldl (+) 0 [0..100000]
==> foldl (+) 0 (0:[0+1..100000])
==> foldl (+) (0+0) [0+1..100000]
==> foldl (+) (0+0) (1:[1+1..100000])
==> foldl (+) (0+0+1) [1+1..100000]

==> foldl (+) (0+0+1+2+...+100000) []
==> 0+0+1+2+...+100000


だけど、例えばghc-6.8.2で-O2だと、Integer用に特殊化されたsumの実装が使われて、
foldlの蓄積引数が積極評価されるので後者になる

483:482
08/01/30 17:08:24
分りにくい気がしたので補足

どっちの評価順でも、リスト生成は遅延される
ただし、素朴に遅延評価をやると足し算まで遅延するので、結果としてリストを走査し終わるまで足し算を開始できない
GHCの最適化は足し算を遅延させないようにするもの

484:474
08/01/30 17:08:53
>>482
ありがとうございます。
とても参考になりました。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5219日前に更新/201 KB
担当:undef