関数型プログラミング言語Haskell Part6
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/11/07(火) 21:24:26http://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の仕様により、行頭の半角スペースは表示されません。
コードをインデントしたいときは、代わりに または全角スペースを使うことができます。
0331329
2006/12/19(火) 19:13:04ありがとう。
それにしてもレスが速いな(・∀・;)
ついでだから実行速度を測ってみた。
最適化しないとhogeの方が若干速いが、-Oをつけると同じ速さになる。
なんか切ないな
0332デフォルトの名無しさん
2006/12/19(火) 19:32:06Haskell では末尾再帰について特に大きなメリットはない。
普通は末尾再帰は逐次計算していけるのから嬉しいのだが、
Haskell は最外簡約を取るので、逐次計算は行われない。
0333デフォルトの名無しさん
2006/12/19(火) 19:48:33>Haskell では末尾再帰について特に大きなメリットはない。
そんなことはないと思うが。
Haskellは常に最外簡約というわけではないし
(GHCは正格性解析の結果に基づいて簡約順序を決める)、
最外簡約の場合でも、クロージャを作って別の関数に渡す代わりに
直接呼んでしまえるのでコストが小さい。
0334デフォルトの名無しさん
2006/12/20(水) 01:39:23推論規則の演習とかやった記憶もかすかにあるんだが。
圏論とかサパーリ。
もとが哲学寄りの文学屋なので、そっち方面の記号論は、まぁわかるんだが。
そんな俺様にお勧めのHaskell文献があったら教えてください。
0335デフォルトの名無しさん
2006/12/20(水) 01:54:260336デフォルトの名無しさん
2006/12/20(水) 01:55:040337334
2006/12/20(水) 02:01:53ごめん。言語解説書ではなくて、背景の理論のほう。
とりあえず俺の勉強したなけなしの記号論理学が
どこをどう通ったらHaskellになるのか見てみたい。
0338デフォルトの名無しさん
2006/12/20(水) 02:06:18まず、歴史的にはMLの方が先だから、MLから入ってみたら?
0339デフォルトの名無しさん
2006/12/20(水) 05:01:09PierceのTAPLでも嫁
それが理解できなければどうせその先も理解できない
0340デフォルトの名無しさん
2006/12/20(水) 06:22:58いつかみんながHASKELLを使う世の中がきたらいいな。
0341デフォルトの名無しさん
2006/12/20(水) 07:31:12Haskellerで元Lisperの方ってどれくらいいるんでしょうか?
元Lisperの方でHaskellに移ってきた方は、Haskellのどのあたりに惹かれました?
0342デフォルトの名無しさん
2006/12/20(水) 08:04:58Haskellはまだ大半が素人みたいなので鞍替えした。
0343デフォルトの名無しさん
2006/12/20(水) 11:15:15Haskellを知っている人ならほぼ確実にLispも知ってるよ。
0344デフォルトの名無しさん
2006/12/20(水) 11:25:490345デフォルトの名無しさん
2006/12/20(水) 11:30:540346デフォルトの名無しさん
2006/12/20(水) 11:54:300347デフォルトの名無しさん
2006/12/20(水) 14:37:22Haskel は全く知らんけど、その記号論理学とはあまり関係無いんじゃないか?
Lisper 以外の大半人たちは高階の理論を記述する際に階によって用語を使い分ける。
ので集合とか射とか群とか圏とかいろんな言葉が出てくるわけだけど、
やってることはλと(暗黙の)括弧が多いか少ないか程度の違いのような気がするので、
そう大上段に構えるほどの物じゃないような・・・
0348デフォルトの名無しさん
2006/12/20(水) 14:40:390349デフォルトの名無しさん
2006/12/21(木) 00:41:189割が両刀
1割は悪い人にだまされて最初の言語がHaskellというケース
0350デフォルトの名無しさん
2006/12/21(木) 01:14:50Haskellだけでも十分おもしろいけど。
0351デフォルトの名無しさん
2006/12/21(木) 01:17:52C++からLispを経由せずにHaskellをやりだした者ですが、
私をだました悪い人はどこですか?
0352デフォルトの名無しさん
2006/12/21(木) 01:41:26Haskellも勉強してるよ
オブジェクト指向しか知らない世代なわけだけど
そこに固まらないうちに関数型も慣れときたいなぁと思って
0353デフォルトの名無しさん
2006/12/21(木) 01:58:04勉強するように言われました。
0354デフォルトの名無しさん
2006/12/21(木) 01:59:43関数型言語習い始めだと、副作用なしというプログラミングスタイルは辛いと思う。
まずは副作用ありの関数型言語で慣れておくと良いと思う。
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のほうが優れてると思うところは?
0358デフォルトの名無しさん
2006/12/21(木) 06:27:28問題なく実行できる。
exeファイルをダブルクリックしたけど一瞬だけコマンドプロンプトが開いてすぐに閉じたから実行できなかったと思ったんじゃないの?
それだったらgetCharでも付けて入力待ちさせりゃいい。
main = do { print $ map square [2, 5, 3, 1, 10]; getChar }
square n = n * n
0359デフォルトの名無しさん
2006/12/22(金) 00:46:51main = do cs getContents
putStr cs
exeファイルにしてコマンドプロンプトで下のように実行しようとしてもできない
ghc out.hs -o out
out 引数(文字列)
なんで?
ふつうのHaskellプログラミングには
実行するには Ctrl - Z + Enter って書いてるけど、これどういう意味?
0360デフォルトの名無しさん
2006/12/22(金) 01:04:25そのぷろぐらむだと引数は関係ない。
outを実行すると入力待ちになるから、適当な文字列を何行かタイプする。
入力を終了したくなったら、まず、カーソルが行頭にある状態で
Ctrlとzを同時押しして(^Zという表示が現れるはず)、
つぎにEnterキーを押せば良い。
0361デフォルトの名無しさん
2006/12/22(金) 08:44:55Haskell の優れてるところ: 型システムによる安心感、純粋関数型なところ
Lisp の優れてるところ: マルチパラダイムなところ、あんま理屈とか考えずに言語を気軽にカスタマイズできるところ
0362デフォルトの名無しさん
2006/12/25(月) 11:44:14使い方次第
0363デフォルトの名無しさん
2006/12/25(月) 18:05:58日本語でおk
0364デフォルトの名無しさん
2006/12/25(月) 20:14:12Haskellの優れているところ:遅延評価、モナド
0365デフォルトの名無しさん
2006/12/25(月) 22:18:130366デフォルトの名無しさん
2006/12/25(月) 23:05:140367デフォルトの名無しさん
2006/12/25(月) 23:19:58優れているかは別として、Haskellでいちばん好きな機能かも。
0368デフォルトの名無しさん
2006/12/25(月) 23:59:33ここはもうビチョビチョじゃねーか
0369デフォルトの名無しさん
2006/12/26(火) 00:21:36doは>>=を使うよりも見栄え良く書けるが、
代入型言語の特徴を残す記法なので、
不満に思う人も多いと思う。
0370デフォルトの名無しさん
2006/12/26(火) 00:54:35似たような意見をwebで時々見掛けるが、よく理解できない。
命令的プログラミングをしたいとき、それに適した構文を
使えるのだから、単純に良いことのように思える。
それとも、命令的プログラミングをサポートしない言語の方が
良いという考えなんだろうか。
0371デフォルトの名無しさん
2006/12/26(火) 01:29:44「関数」で統一された世界を作れば、何か良いことがあるに違いない
(古風な言い方である自動プログラミング、とか、構造の視覚化がしやすくなる、とか、etc..)
と思う人が多いからじゃないかな?
0372デフォルトの名無しさん
2006/12/26(火) 01:31:33http://hp.vector.co.jp/authors/VA000092/jokes/strup.html
0373デフォルトの名無しさん
2006/12/26(火) 02:48:410374デフォルトの名無しさん
2006/12/26(火) 14:22:410375デフォルトの名無しさん
2006/12/26(火) 22:44:220376デフォルトの名無しさん
2006/12/27(水) 00:03:09a <- hoge;
hoge2 a;
hoge3 a
}
と
hoge >>=
\a ->
hoge2 a >>
hoge3 a
どっちがみやすいですか?
0377352
2006/12/27(水) 01:44:38この記事おもしろいねw
真実だとしても、結局のところ今はPCの性能の上昇とか
言語自体の進化によってオブジェクト指向は機能的で合理的な言語になってるよね?
たしかに、
「あるプロジェクトのコードを再利用した話なんて聞いたことない」とか、
「正しく継承させるためには設計だけでCの3倍もの時間かかる」とか、
超笑えるねw
当たり前に思ってきた(教えられてきた)コトって、
そのまま信じちゃうからこういう記事読むとオラ、ワクワクしてきたぞ
0378デフォルトの名無しさん
2006/12/27(水) 02:04:040379デフォルトの名無しさん
2006/12/27(水) 02:05:25あの内容はあながち冗談に思えなくて泣けてきた。
彼がinterviewであんなこと言うはずは無いだろうけどさ
0380デフォルトの名無しさん
2006/12/27(水) 02:32:15チャッチャと書けるようになったらダイブ頭よくなってるかな?
0381デフォルトの名無しさん
2006/12/27(水) 03:01:210382デフォルトの名無しさん
2006/12/27(水) 03:12:31もっとHaskeりたいんだけど、やさしく教えてくれるかわいいコいないかな
0383デフォルトの名無しさん
2006/12/27(水) 03:14:55禁句だ。
0384デフォルトの名無しさん
2006/12/27(水) 22:11:40Haskellを教えてくれるギャルを探すんだよ
0385デフォルトの名無しさん
2006/12/27(水) 22:47:06| |
| |
∧_∧ | | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
( ´Д`)// < ⊥が返ると思います!
/ / \
/ /| /  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
__| | .| |
\  ̄ ̄ ̄ ̄ ̄ ̄ ̄\
||\ \
||\|| ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ̄
|| || ̄ ̄ ̄ ̄ ̄ ̄ ̄||
.|| ||
0386デフォルトの名無しさん
2006/12/30(土) 22:17:23少なくともVBやJavaやってるよりは確実にイケテルよね?
モナドとかラムダとか遅延評価について語るだけでモテモテな世の中になればいいのに。
0387デフォルトの名無しさん
2006/12/30(土) 22:50:41俺もそう思う。
思いたい。
0388デフォルトの名無しさん
2006/12/30(土) 23:04:43普段は泥臭いPerl使ってる俺は死んだらいい。
0389デフォルトの名無しさん
2006/12/30(土) 23:06:560390デフォルトの名無しさん
2006/12/30(土) 23:47:59■オサレ言語
Haskell、Clear、その他の純粋関数型言語
■普通の言語
C、C++、C#、アセンブラ、PHP、Perl、awk
■キモい・胡散臭い
Ruby(特にRails界隈)、Ajax、XML、Paython、その他Web2.0に絡む言語すべて
■オッサン専用
COBOL、FORTRAN、PASCAL
■厨言語
Java、VB、BASIC、HSP
0391デフォルトの名無しさん
2006/12/31(日) 00:07:220392デフォルトの名無しさん
2006/12/31(日) 01:02:19■オサレ言語
Haskell、Concurrent Clean、その他の純粋関数型言語
■普通の言語
C++、C#、Java、VB.NET
■泥臭い
Perl
■ハッカー専用
C、アセンブラ、awk、Python
■キモい・胡散臭い
PHP、Ruby
■オッサン専用・過去の遺物
COBOL、FORTRAN、PASCAL
■厨言語
VB、BASIC、HSP、Delphi
■宗教
Lisp、その他Lisp系統
0393デフォルトの名無しさん
2006/12/31(日) 01:06:400394デフォルトの名無しさん
2006/12/31(日) 01:49:490395デフォルトの名無しさん
2006/12/31(日) 09:30:38C で言う != みたいな記号ってないん?
環境は WinHugs 使ってる。
0396デフォルトの名無しさん
2006/12/31(日) 10:37:39HSPは胡散臭い言語だと思います。
0397デフォルトの名無しさん
2006/12/31(日) 10:43:32(!=) :: Eq a => a -> a -> Bool
(!=) = (/=)
0398デフォルトの名無しさん
2006/12/31(日) 13:12:31あと perl はなにげにハッカー言語だと思う
0399デフォルトの名無しさん
2006/12/31(日) 13:25:47ハッカーが「つくっている」≠ ハッカー言語
0400デフォルトの名無しさん
2006/12/31(日) 13:35:02そう言う意味で C やアセンブラは納得できるけど Python はどうかなぁ
0401デフォルトの名無しさん
2006/12/31(日) 16:51:27http://www.sauria.com/~twl/conferences/pycon2005/20050325/Python%20at%20Google.html
0402デフォルトの名無しさん
2006/12/31(日) 19:23:05main = putStrLn "こんにちは!"ってやるとエラーになるんですけれど・・・
あきらめるしかないんでしょうか?
0403デフォルトの名無しさん
2006/12/31(日) 22:24:01ありがとう
0404デフォルトの名無しさん
2007/01/01(月) 10:53:25putStrLn とかはまだ未対応みたいね。
0405デフォルトの名無しさん
2007/01/01(月) 13:46:12Hugsだと動く。
0406デフォルトの名無しさん
2007/01/01(月) 23:29:560407デフォルトの名無しさん
2007/01/01(月) 23:41:17EUC環境なら普通にできるよ。
0408402
2007/01/02(火) 00:02:38>>405
ネイティブなバイナリを作りたいんです。
>>406
標準入力から入力した文字を処理させたいんです。
出来るでしょうか?
>>407
windowsマシンしか持ってないんです・・・
0409デフォルトの名無しさん
2007/01/02(火) 00:23:32ただのバイト列としての扱いになるけど一応読み込めて表示できる。
0410デフォルトの名無しさん
2007/01/02(火) 14:03:50逆。プログラムには埋め込めるけど入出力ができない。
>>408
http://yogimo.sakura.ne.jp/ssc/index_ja.html
外部ライブラリだけど、とりあえず日本語の入出力はできる。
0411デフォルトの名無しさん
2007/01/02(火) 16:04:51GHC6.4ではEUCだったらソースコード中に書いてもコンパイル可能。
putStrなどで出力するとEUCのまま出力される。
そのため、WindowsではEUC→ShiftJIS変換を掛けた後putStrしないとうまく表示できなかった。
GHC6.6ではソースコードの文字コードがUTF-8になったため、
UTF-8形式でなら日本語の文字列をソースコードに記述できるようになった。
しかし、putStrなどのIOの基本部分はまだきちんとUTF-8対応してないため、
UTF-8形式の文字列をそのまま出力させることができない。
ただ、6.4のときと同じようにUTF-8→ShiftJIS変換して出力させるのなら表示できる。
410が紹介しているライブラリはそう言った処理を行ってくれる。
0412デフォルトの名無しさん
2007/01/02(火) 17:48:11間違ってるところがあったら指摘してほしい。
Haskell98によると、Charは一つのUnicode文字を表す(6.1.2)。
これに従って、比較的新しいHugsやGHC(6.4系を含む)ではCharは32ビット整数になっている。
ただし、どちらも入出力に際しての変換が完全でない。具体的には、
・ソースコード中の文字列リテラル
・System.IOライブラリでの入出力
が問題になる。
1. GHC6.4.2以前
ソースコード・入出力ともLatin-1を仮定する。Latin-1ではバイト値と
コードポイントが一致するので、入力時には外部エンコードの各バイトがそのままCharに
入り、出力時にはCharの下位8ビットのみが出力されるような実装になっている。
このため、あるエンコーディング(Latin-1とは限らない)の入力をgetLineで受け取り、
それをそのままputStrで表示すれば、入力時とおなじエンコードにおいて正しく表示される。
これを利用して、[Char]を、本来のコードポイントの列としてではなく、特定のエンコードの下での
バイト列として使うことができる。ただし文字列リテラルについては、GHCはLatin-1として
不正な文字を受け付けないので、EUC-JPのような例外を除くと、単純にリテラルを使うことはできない。
2. GHC6.6
ソースコードにはUTF-8、入出力にはLatin-1を仮定する。このため、EUC-JPでリテラルを直に
書くことはできない。
(続く)
0413デフォルトの名無しさん
2007/01/02(火) 17:49:243.最近のHugs(非WindowsかつCのwchar_tがUnicodeの環境、というかLinux)
ソースコード・入出力ともロケールのエンコードを利用する。
4.最近のHugs(Windows)
ソースコード・入出力ともLatin-1を仮定する。ただし文字列リテラルにShift-JISを使ってもエラーにならない。
5.最近のHugs(それ以外)
未調査。
・結局どうするか。
規格どおりにCharにUnicodeを入れるか、Charを単なるバイトとして扱うかの二択。
i. CharをUnicodeとして扱う
(3)以外の場合入出力で変換が必要。(2)または(3)以外の場合文字列リテラルでは
明示的なエスケープ(たとえば"\22234")が必要。
ii. Charをバイトとして扱う
(3)ではファイルをバイナリモードで開くなどの対策が必要。(1)でEUC-JPを使う場合と(4)
を除き文字列リテラルでは明示的なエスケープ(たとえば"\143\153")が必要。
lengthやisAlphaのような関数、およびwin32パッケージの関数(win32API)が正しく動作しない。
0414デフォルトの名無しさん
2007/01/03(水) 00:32:02ttp://d.hatena.ne.jp/ha-tan/20070102/1167722751
このあたりも。
0415デフォルトの名無しさん
2007/01/03(水) 01:24:370416デフォルトの名無しさん
2007/01/03(水) 02:49:120417デフォルトの名無しさん
2007/01/03(水) 10:33:09問題はむしろSystem.IOを書き直すのが(重要度の割には)面倒だ、というところに
あるんじゃないかと。
0418デフォルトの名無しさん
2007/01/03(水) 11:02:511関数とアクションは何が違うのでしょうか?
2square n = n*n
というのはnを引数とする関数を定義しているんですよね。
cみたいにn = n*nという代入を表しているんじゃないですよね?(説明が難しい)
0419デフォルトの名無しさん
2007/01/03(水) 12:00:081. アクションとはIO aを返す関数のことです
2. まずは、squareの型を見てみましょう。
square :: Num a => a -> a
ということですから、代入ではありません。
0420デフォルトの名無しさん
2007/01/03(水) 12:00:500421デフォルトの名無しさん
2007/01/03(水) 12:09:36main 関数の返す値が最終的に実行される。
Perl や JavaScript で、プログラムを内部的に文字列として生成して、
最後に eval で実行するような状況に少し似てる。
2. 関数 square n と n*n とが等値であることを定義しているだけ。
数学では = ってのは左辺と右辺が等しいことを表すよね。
x + 2y = 4 とか、f(x) = 2x + 1 とか。あれと同じ。
0422デフォルトの名無しさん
2007/01/03(水) 12:13:31>アクションとはIO aを返す関数のことです
アクション(動作)はIO a型の値のことじゃないか?
たとえばputStrは文字列を取って動作を返す関数。
putStr "Hello"は動作。
0423デフォルトの名無しさん
2007/01/03(水) 12:48:55プログラミング指向の論文を読んでいると、
引数または返値に"IO a"を含むものをfunctionとは呼ばずにactionと呼んでいる事が多いので、
そう書いたんだよ。
0424デフォルトの名無しさん
2007/01/03(水) 12:50:080425デフォルトの名無しさん
2007/01/03(水) 13:05:45代入ではないんですね。
どうも混乱してしまって・・・
cでいう
# include <stdio.h>
int main (void)
{
int y = 0;
y = sqare(3);
printf("%d\n",y);
}
int sqare (int n)
{
n = n*n;
return n;
}
のn = n*n;とは別なんですよね?
0426デフォルトの名無しさん
2007/01/03(水) 13:10:07IOっていうのが味噌なんですね。
それとcのプログラム、関数宣言してないですけど、許してください。
0427デフォルトの名無しさん
2007/01/03(水) 13:41:21意味的には似てるけど、
たとえば、Cではsquare(2)とすれば、それがその場で実行されて4という値として扱われるけど、
Haskellでは(square 2)そのものとして扱います。
まず、IO a -> a という事はできません(IOがいったんくっついたら取り外すことはできないの)ので、
Haskellではmainを評価することで実行されますが、
最終的にはmainまで … -> IO aというのを続けて書いていかないとダメなの。
main関数の型は main :: IO () ですよね。
0428デフォルトの名無しさん
2007/01/03(水) 13:42:50square n = n * n
に近い書き方は、
int square(int n) { return n*n; }
だね。
逆に、
int sqare (int n) { n = n*n; return n; }
に近いのは
square n
= let m = n * n
in m
0429デフォルトの名無しさん
2007/01/03(水) 22:39:29main = do func 1
これ ghc だと通ったんですけど、この場合の func の型は何ですか?
0430デフォルトの名無しさん
2007/01/03(水) 23:54:51■ このスレッドは過去ログ倉庫に格納されています