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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/11/07(火) 21:24:26
haskell.org
http://www.haskell.org/

日本語サイト
http://www.sampou.org/cgi-bin/haskell.cgi
http://shidot.dyndns.org/hs/

過去ログ
関数型プログラミング言語Haskell
Part1 http://pc.2ch.net/tech/kako/996/996131288.html
Part2 http://pc2.2ch.net/test/read.cgi/tech/1013846140/
Part3 http://pc8.2ch.net/test/read.cgi/tech/1076418993/
Part4 http://pc8.2ch.net/test/read.cgi/tech/1140717775/
Part5 http://pc8.2ch.net/test/read.cgi/tech/1149263630/

関連スレは>>2
関連書籍は>>3

・2chの仕様により、行頭の半角スペースは表示されません。
 コードをインデントしたいときは、代わりに または全角スペースを使うことができます。
0283デフォルトの名無しさん2006/12/10(日) 11:18:22
>>280
>圏論的な考え方を身につけた人にとって考えを整理しやすい書き方、ということでいいだろうか。

まぁせっかく勉強したんだから使っていこうじゃんという気持ちも大きい。

>俺としては、「表面上」支障がなければそれで十分だと思う。
>例えばライブラリを提供する/使うだけならスタイルの不一致は問題にならないし。

その通りだと思う。ただ圏論の概念の名前を冠した射(ファンクタ、リフトetc..)は
(個人的に)理解して欲しい。
ちゃんとそういう名前がついているわけだし。

>結局聞きたかったのは「圏論ってそんなにすごいの?」だったような。

実際的な利益はほとんど無いんじゃないかと思う。
一般的抽象のナンセンスといわれるようにすごくないと感じる人も
いて全然おかしくない。個人的な価値観の問題なのかな。

ただ、モナドに関する情報の中でどれが有意義な議論なのか
見分けることができるようにはなった。
あと、うまくいえないがしっくりとする。
なんかしっくりとこないなぁというひとはちょっとやってみると
いいんじゃなかろうか。
0284デフォルトの名無しさん2006/12/10(日) 14:48:03
>>282
スマン寝ぼけて無視してた。
Functorクラスでfmapの定義
fmap id = id
fmap (f . g) = fmap f . fmap g

とあるけどこれはまんま圏A、B間のファンクタFの定義
F( id_A ) = id_B
F( f_A ・ g_A ) = f_B・g_B
と同じ。
ただ、厄介なことにfmapがファンクタというわけではない
(ファンクタを構成するarrow functionというものにあたる)
arrow functionこと射関数っていうのは関数を圏の異なる関数に
移す関数。(関数というと語弊があるから「作用」というべきか)

うむ。そうだfmapは関数ではない。「関数」に作用する「作用素」と
見るべきだから中間演算子として使うのはダメ。
というのではどうですか。
0285デフォルトの名無しさん2006/12/10(日) 14:59:31
なんか変なことかいてしまったかも。

まぁfunctionって意味が広いんだよ。
それを全部functionという単語の元
素朴な関数概念で置き換えちゃうから・・・。

うーん。自分でいっててよくわからん。
真偽は自分で考えてくれ。
0286デフォルトの名無しさん2006/12/10(日) 16:36:52
圏論を知っても頭は整理されない、ということだけはわかった
0287デフォルトの名無しさん2006/12/10(日) 17:02:27
確かにね、否定できんな。
まぁグダグダだしね
0288デフォルトの名無しさん2006/12/11(月) 13:01:48
関数型超初心者なんですが、圏論を使うとプログラムとかでこんなにエレガントになるという例とかってありますか?
0289デフォルトの名無しさん2006/12/11(月) 16:39:02
すみません、こちらはもっとベタな質問なのですが、
HaskellのFunctorと、C++のファンクタって、何か関係がありますか?
C++のファンクタは、単なる呼び出し可能のオブジェクトなのですが。
0290デフォルトの名無しさん2006/12/11(月) 16:44:04
あと、これも非常に低レベルな質問です。
http://itpro.nikkeibp.co.jp/article/COLUMN/20061005/249933/

この連載を少しずつ読んでいるのですが、
fmapがあればmapは要らないような気がします。なぜmapが残っているのでしょ
うか?
0291デフォルトの名無しさん2006/12/11(月) 18:13:45
>>289
どちらも語源がfunctionである、という以上の繋がりはないと思う。
0292デフォルトの名無しさん2006/12/11(月) 20:02:35
じゃあHaskellのファンクタとOCamlのファンクタは関係ある?
289じゃないけど便乗。
0293デフォルトの名無しさん2006/12/11(月) 20:27:22
C++のファンクター、カンケネー♪
OCamlのファンクター、カンケネー♪
0294デフォルトの名無しさん2006/12/11(月) 21:10:57
OCaml のファンクタも Haskell のファンクタも、圏論のファンクタ(関手)を
ベースにした概念という意味では関係がある。
C++のファンクタはまた違う語源のものなので関係ないという話をどこかで読んだことがある。
02952892006/12/11(月) 21:16:52
皆さん、ありがとうございます。
C++とは関係ないのですね。しきりに首をひねっておりました。
0296デフォルトの名無しさん2006/12/11(月) 23:01:06
俺も質問させてください。
words関数やlines関数の実装で、リストのリストを返す方法がわかりません。
"hello world" を引数に取って["hello","world"]と返す関数はどのように実装したらいいでしょうか
0297デフォルトの名無しさん2006/12/11(月) 23:03:54
f "hello world" = ["hello","world"]
f _ = []
0298デフォルトの名無しさん2006/12/11(月) 23:13:34
>>289
ttp://www.jmuk.org/d/?path=2005/08/22#d22t03
0299デフォルトの名無しさん2006/12/12(火) 09:22:19
>>296
http://www.sampou.org/haskell/report-revised-j/standard-prelude.html#$vlines
0300デフォルトの名無しさん2006/12/12(火) 12:25:47
>>290あの記事を理解できる時点で低レベルじゃない
0301デフォルトの名無しさん2006/12/12(火) 17:03:37
>>290
互換性のために残ってるのだと思う。
単相性制限があるから、単純にmapをfmapに置き換えることは出来ない。
03022892006/12/12(火) 17:25:36
>>298
おお!向井さんの所でまとまっていたとは!

>>300
いや、私には難しいので、読むのにすごく時間がかかります。
だけど、入門Haskellのモナドまでを読めば、何とか理解できる範囲だと思います。
圏論の全く分からない私にはありがたい連載です。
何より、とても面白いと思います。

>>301
やはり過去互換性ですか。単相性制限?が分かりませんが、だからfmapという
新しい名前を作る必要があったのですね。
0303デフォルトの名無しさん2006/12/14(木) 11:38:37
質問です
Visual Haskellをインストールしようとしたところ、
WindowsHostScriptで「Failed to setup vs_haskell.dll」というエラーが出たのですが、
これを解決する方法はありませんか?
よろしくお願いします。
0304デフォルトの名無しさん2006/12/15(金) 02:29:08
使うな。
0305デフォルトの名無しさん2006/12/15(金) 07:20:19
ありがとうございます。
解決しました。
0306デフォルトの名無しさん2006/12/15(金) 10:53:23
>>304-305
自作自演乙
0307デフォルトの名無しさん2006/12/15(金) 22:38:25

map関数がわからん
使うだけなら簡単なんだけど、型の宣言がつじつま合わないというか
とにかく納得できない

ふつうのHaskellプログラミングみながら勉強してんだけど
ここで3〜4日停滞してる

square n = n * n
map :: (a -> b) -> [a] -> [b]
map square [1, 2, 3]

この場合の「map関数」の宣言、最初の「a」が「square関数」を指しているのか?
@(a -> b)の部分で「square 1」「square 2」「square 3」と計算して
A???
0308デフォルトの名無しさん2006/12/15(金) 22:51:17
>>307
a->bはaを受け取ってbを返す関数の型。
mapは「aを受け取ってbを返す関数」とaのリストを受け取って、bのリストを返す関数。
a->bにあたるのはsquareだけだよ。
0309デフォルトの名無しさん2006/12/15(金) 23:00:55
Haskel 全く知らんけど、それって

map :: (a -> b) -> ( [a]  -> [b] )
(map square) [1, 2, 3]

ってこと(文法も知らんが)?
03103072006/12/15(金) 23:53:33
>a->bにあたるのはsquareだけだよ。
ソウイウコトカ!!!
スッキリー、スッキリ-
0311デフォルトの名無しさん2006/12/15(金) 23:56:33
>>309
そうそう。haskellの多変数関数は関数を値とする一変数関数。
文法もそれでもあってるはず。
0312デフォルトの名無しさん2006/12/16(土) 13:01:08
ところでkleisliの読み方がわからないんですがクライスリ?
0313デフォルトの名無しさん2006/12/16(土) 16:38:02
Hugsのcompile.cなど一部のC source fileは
-O2無しでcompileされるようにMakefileinが書かれているけど
C compilerの最適化の副作用を避けるため等のなにか理由がある?
0314デフォルトの名無しさん2006/12/16(土) 23:10:46
どうだろう。
変数がレジスタに乗ってしまってメモリ上から消えると、
GCを前提とした言語処理系では問題になることがあるみたいだが。
0315デフォルトの名無しさん2006/12/17(日) 09:47:59
>>314
それはない。
しかし、レジスタ上だろうがメモリ上だろうが、変数が元の値ではなく
加工された値でしか存在しないという状況はあり得て問題になる。
0316デフォルトの名無しさん2006/12/17(日) 16:10:40
>>313-315
ある特定の処理系の組み合わせで問題が起きることはあるかもしれないが、
常に問題が起きるってことはない。ソースコードが間違えていないなら、ね。
ソースコードは間違えているけど「ある処理系では問題が起きない」てのは
よくある話。

-O2の付け忘れでなければ、まずいコードになっているのかも?
0317デフォルトの名無しさん2006/12/17(日) 21:48:39
volatile は役に立たんのけ?
0318デフォルトの名無しさん2006/12/17(日) 22:17:14
>>317
役に立つ。というか必要なところにvolatileがないのはダメだろ。
スレ違いなんでこのへんで
0319デフォルトの名無しさん2006/12/18(月) 23:32:54

だれかHaskellの再帰について教えて
くわしく、わかりやすく、ていねいに
0320デフォルトの名無しさん2006/12/18(月) 23:53:40
aaa :: Int -> Int
aaa a = aaa (a+1)
0321デフォルトの名無しさん2006/12/19(火) 00:01:57
let
  空 = 色
  色 = 空
in Data.Set.singleton 空
0322デフォルトの名無しさん2006/12/19(火) 00:07:22

わからん
おまえの説明はまったくわからん大滝 秀治)
0323デフォルトの名無しさん2006/12/19(火) 01:01:50
再帰という概念がわからないのか、それとも Haskell における再帰の取り扱いがわからないのか、どっち?
0324デフォルトの名無しさん2006/12/19(火) 01:16:38
Javaの再帰はいちおう書ける
スマンがねる
良レスに期待
0325デフォルトの名無しさん2006/12/19(火) 09:06:05
期待されても困るよ(笑)
というか、再帰のプログラムが書けるのなら、なおさら何が疑問なのかがわからん。

http://www.shiro.dreamhost.com/scheme/docs/tailcall-j.html
とかでどうだ。Haskellじゃないけど。
0326デフォルトの名無しさん2006/12/19(火) 16:44:17
>>324
とりあえず、再帰を身体にしみこませる必要があると思うんだ。

Little Schemer
http://www.amazon.co.jp/exec/obidos/ASIN/0262560992

Scheme手習い(上記の本の邦訳。入手困難)
http://www.fukkan.com/fk/VoteDetail?no=6462

Haskellはそのあとでも十分。
0327デフォルトの名無しさん2006/12/19(火) 17:07:27
再帰を身体にしみこませるのにHaskellを使わない理由があるのか?
0328デフォルトの名無しさん2006/12/19(火) 17:16:33
prolog
0329デフォルトの名無しさん2006/12/19(火) 17:42:59
325を読んで疑問に思ったのだが、
hoge n 0 = n
hoge n c = hoge (n + 1) (c - 1)
hoge2 0 = 0
hoge2 c = 1 + hoge2 (c - 1)
hogeは末尾再帰だと思うのだが、hoge2も最後にhoge2があるから末尾再帰なのだろうか。
それとも、1 + hoge2が最後の処理だから末尾再帰じゃない、っていう解釈をするのかな?
0330デフォルトの名無しさん2006/12/19(火) 17:49:28
>>329 hoge2 は末尾再帰ではない.
03313292006/12/19(火) 19:13:04
>>330
ありがとう。
それにしてもレスが速いな(・∀・;)

ついでだから実行速度を測ってみた。
最適化しないとhogeの方が若干速いが、-Oをつけると同じ速さになる。
なんか切ないな
0332デフォルトの名無しさん2006/12/19(火) 19:32:06
>>331
Haskell では末尾再帰について特に大きなメリットはない。
普通は末尾再帰は逐次計算していけるのから嬉しいのだが、
Haskell は最外簡約を取るので、逐次計算は行われない。
0333デフォルトの名無しさん2006/12/19(火) 19:48:33
>>332
>Haskell では末尾再帰について特に大きなメリットはない。
そんなことはないと思うが。
Haskellは常に最外簡約というわけではないし
(GHCは正格性解析の結果に基づいて簡約順序を決める)、
最外簡約の場合でも、クロージャを作って別の関数に渡す代わりに
直接呼んでしまえるのでコストが小さい。
0334デフォルトの名無しさん2006/12/20(水) 01:39:23
なぁなぁ、教養科目で記号論理学だけやったんだが。
推論規則の演習とかやった記憶もかすかにあるんだが。
圏論とかサパーリ。
もとが哲学寄りの文学屋なので、そっち方面の記号論は、まぁわかるんだが。
そんな俺様にお勧めのHaskell文献があったら教えてください。
0335デフォルトの名無しさん2006/12/20(水) 01:54:26
Haskell文献?それって言語解説書?
0336デフォルトの名無しさん2006/12/20(水) 01:55:04
テンプレにあると思うが。
03373342006/12/20(水) 02:01:53
>335
ごめん。言語解説書ではなくて、背景の理論のほう。
とりあえず俺の勉強したなけなしの記号論理学が
どこをどう通ったらHaskellになるのか見てみたい。
0338デフォルトの名無しさん2006/12/20(水) 02:06:18
>>337
まず、歴史的にはMLの方が先だから、MLから入ってみたら?
0339デフォルトの名無しさん2006/12/20(水) 05:01:09
>>337
PierceのTAPLでも嫁
それが理解できなければどうせその先も理解できない
0340デフォルトの名無しさん2006/12/20(水) 06:22:58
HASKELLってほんとに綺麗だよね。
いつかみんながHASKELLを使う世の中がきたらいいな。
0341デフォルトの名無しさん2006/12/20(水) 07:31:12
ひとつお聞きしたいのですが、
Haskellerで元Lisperの方ってどれくらいいるんでしょうか?

元Lisperの方でHaskellに移ってきた方は、Haskellのどのあたりに惹かれました?
0342デフォルトの名無しさん2006/12/20(水) 08:04:58
LISPはスーパーな人が沢山いて、敵う気がしなかった。
Haskellはまだ大半が素人みたいなので鞍替えした。
0343デフォルトの名無しさん2006/12/20(水) 11:15:15
>>341
Haskellを知っている人ならほぼ確実にLispも知ってるよ。
0344デフォルトの名無しさん2006/12/20(水) 11:25:49
俺 Lisp は知ってるけど Lisper じゃないな
0345デフォルトの名無しさん2006/12/20(水) 11:30:54
言語の違いでプログラマが変わるわけでもあるまい
0346デフォルトの名無しさん2006/12/20(水) 11:54:30
用途によっていくつかの言語使い分けるから、何々erではないな
0347デフォルトの名無しさん2006/12/20(水) 14:37:22
>>337
Haskel は全く知らんけど、その記号論理学とはあまり関係無いんじゃないか?

Lisper 以外の大半人たちは高階の理論を記述する際に階によって用語を使い分ける。
ので集合とか射とか群とか圏とかいろんな言葉が出てくるわけだけど、
やってることはλと(暗黙の)括弧が多いか少ないか程度の違いのような気がするので、
そう大上段に構えるほどの物じゃないような・・・
0348デフォルトの名無しさん2006/12/20(水) 14:40:39
あまたあるプログラミング言語の一つ
0349デフォルトの名無しさん2006/12/21(木) 00:41:18
>>341
9割が両刀
1割は悪い人にだまされて最初の言語がHaskellというケース
0350デフォルトの名無しさん2006/12/21(木) 01:14:50
Lispを最初にやってたほうがいいんかな?
Haskellだけでも十分おもしろいけど。
0351デフォルトの名無しさん2006/12/21(木) 01:17:52
>>349
C++からLispを経由せずにHaskellをやりだした者ですが、
私をだました悪い人はどこですか?
0352デフォルトの名無しさん2006/12/21(木) 01:41:26
Javaだけなんとかギリギリできるけど
Haskellも勉強してるよ

オブジェクト指向しか知らない世代なわけだけど
そこに固まらないうちに関数型も慣れときたいなぁと思って
0353デフォルトの名無しさん2006/12/21(木) 01:58:04
先輩が Lisper で、静的型と動的型の違いを勉強するために Haskell も合わせて
勉強するように言われました。
0354デフォルトの名無しさん2006/12/21(木) 01:59:43
>>350
関数型言語習い始めだと、副作用なしというプログラミングスタイルは辛いと思う。
まずは副作用ありの関数型言語で慣れておくと良いと思う。
0355デフォルトの名無しさん2006/12/21(木) 02:50:42
>関数型言語習い始めだと、副作用なしというプログラミングスタイルは辛いと思う。
議論することじゃないが、俺はそうは思わない、という意見だけ表明しておく。
0356ド素人2006/12/21(木) 02:53:37

盛り上がってるとこ悪いんだけどくだらない質問
精製されたexeファイルをGHC入れてない人に実行させるにはどうすりゃいいの?

main = print $ map square [2, 5, 3, 1, 10]
square n = n * n

たとえば↑みたいなプログラムをexeにしたって実行できないよね?
どういうのならできるんだ???
0357デフォルトの名無しさん2006/12/21(木) 02:54:35
Lisp出来る人から見てHaskellの優れてるとこってどこ?
逆にLispのほうが優れてると思うところは?
0358デフォルトの名無しさん2006/12/21(木) 06:27:28
>>356
問題なく実行できる。

exeファイルをダブルクリックしたけど一瞬だけコマンドプロンプトが開いてすぐに閉じたから実行できなかったと思ったんじゃないの?
それだったらgetCharでも付けて入力待ちさせりゃいい。
main = do { print $ map square [2, 5, 3, 1, 10]; getChar }
square n = n * n
0359デフォルトの名無しさん2006/12/22(金) 00:46:51
低レベルな質問2
main = do cs getContents
       putStr cs

exeファイルにしてコマンドプロンプトで下のように実行しようとしてもできない
ghc out.hs -o out
out 引数(文字列)

なんで?
ふつうのHaskellプログラミングには
実行するには Ctrl - Z + Enter って書いてるけど、これどういう意味?
0360デフォルトの名無しさん2006/12/22(金) 01:04:25
>>359
そのぷろぐらむだと引数は関係ない。
outを実行すると入力待ちになるから、適当な文字列を何行かタイプする。
入力を終了したくなったら、まず、カーソルが行頭にある状態で
Ctrlとzを同時押しして(^Zという表示が現れるはず)、
つぎにEnterキーを押せば良い。
0361デフォルトの名無しさん2006/12/22(金) 08:44:55
>>357 どっちもイイね。
Haskell の優れてるところ: 型システムによる安心感、純粋関数型なところ
Lisp の優れてるところ: マルチパラダイムなところ、あんま理屈とか考えずに言語を気軽にカスタマイズできるところ
0362デフォルトの名無しさん2006/12/25(月) 11:44:14
>>357
使い方次第
0363デフォルトの名無しさん2006/12/25(月) 18:05:58
>>362
日本語でおk
0364デフォルトの名無しさん2006/12/25(月) 20:14:12
>>361
Haskellの優れているところ:遅延評価、モナド
0365デフォルトの名無しさん2006/12/25(月) 22:18:13
Haskellの劣っているところ:遅延評価、モナド
0366デフォルトの名無しさん2006/12/25(月) 23:05:14
遅延評価は言語の進化過程で最新の部類だぞ・・
0367デフォルトの名無しさん2006/12/25(月) 23:19:58
モナド(というかdo記法)大好き。
優れているかは別として、Haskellでいちばん好きな機能かも。
0368デフォルトの名無しさん2006/12/25(月) 23:59:33
なにが遅延評価だ
ここはもうビチョビチョじゃねーか
0369デフォルトの名無しさん2006/12/26(火) 00:21:36
>>367
doは>>=を使うよりも見栄え良く書けるが、
代入型言語の特徴を残す記法なので、
不満に思う人も多いと思う。
0370デフォルトの名無しさん2006/12/26(火) 00:54:35
>>369
似たような意見をwebで時々見掛けるが、よく理解できない。
命令的プログラミングをしたいとき、それに適した構文を
使えるのだから、単純に良いことのように思える。
それとも、命令的プログラミングをサポートしない言語の方が
良いという考えなんだろうか。
0371デフォルトの名無しさん2006/12/26(火) 01:29:44
>>370
「関数」で統一された世界を作れば、何か良いことがあるに違いない
(古風な言い方である自動プログラミング、とか、構造の視覚化がしやすくなる、とか、etc..)
と思う人が多いからじゃないかな?
0372デフォルトの名無しさん2006/12/26(火) 01:31:33
>>352
http://hp.vector.co.jp/authors/VA000092/jokes/strup.html
0373デフォルトの名無しさん2006/12/26(火) 02:48:41
自分はどするよりコンビネータでモナモナする方がいいな。
0374デフォルトの名無しさん2006/12/26(火) 14:22:41
どするって流行らせたいの?w
0375デフォルトの名無しさん2006/12/26(火) 22:44:22
>>=は横に長くなっちゃうのがいまいちだけど、見た目がかっこいいからついつい使ってしまう
0376デフォルトの名無しさん2006/12/27(水) 00:03:09
do {
a <- hoge;
hoge2 a;
hoge3 a
}



hoge >>=
\a ->
hoge2 a >>
hoge3 a

どっちがみやすいですか?
03773522006/12/27(水) 01:44:38
>>372
この記事おもしろいねw

真実だとしても、結局のところ今はPCの性能の上昇とか
言語自体の進化によってオブジェクト指向は機能的で合理的な言語になってるよね?

たしかに、
「あるプロジェクトのコードを再利用した話なんて聞いたことない」とか、
「正しく継承させるためには設計だけでCの3倍もの時間かかる」とか、
超笑えるねw

当たり前に思ってきた(教えられてきた)コトって、
そのまま信じちゃうからこういう記事読むとオラ、ワクワクしてきたぞ
0378デフォルトの名無しさん2006/12/27(水) 02:04:04
Haskellだと10倍の時間をかけて10分の1の行数ですみます。
0379デフォルトの名無しさん2006/12/27(水) 02:05:25
数十万行のsoftware開発してきた身からすると
あの内容はあながち冗談に思えなくて泣けてきた。
彼がinterviewであんなこと言うはずは無いだろうけどさ
0380デフォルトの名無しさん2006/12/27(水) 02:32:15
>>378
チャッチャと書けるようになったらダイブ頭よくなってるかな?
0381デフォルトの名無しさん2006/12/27(水) 03:01:21
何を創ったかによるだろ
0382デフォルトの名無しさん2006/12/27(水) 03:12:31
だよなー
もっとHaskeりたいんだけど、やさしく教えてくれるかわいいコいないかな
■ このスレッドは過去ログ倉庫に格納されています