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

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

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001デフォルトの名無しさんNGNG
Haskellの公式HP
http://www.haskell.org/
日本語サイト
http://www.sampou.org/cgi-bin/haskell.cgi
Http://www.teu.ac.jp/kougi/koshida/Prog6/index.html

過去ログ、関連スレは>>2-5
0809デフォルトの名無しさん2005/12/20(火) 10:47:45
>>797じゃないですがReadのインスタンスの作り方わからない…
readsPrecとreadListの作り方のチュートリアルか何かないでしょうか(できればShowの方も)
Haskell98Report読んでもサッパリです
0810デフォルトの名無しさん2005/12/20(火) 13:02:57
instance Eq a => Eq (List a) where
 Nil == Nil = True
 Cons x xs == Cons y ys = x == y && xs == ys
 _ == _ = False
0811デフォルトの名無しさん2005/12/20(火) 18:59:40
>>808
なるほど。納得です。

>>810
こうすると出来ますね。
Eq クラスのインスタンスに制限されるってこういうことだったのですね
有難うございました。
0812デフォルトの名無しさん2005/12/21(水) 23:26:59
>>809
チュートリアルじゃないけど、GHC.Readにいくつかinstanceの例がある。
http://cvs.haskell.org/cgi-bin/cvsweb.cgi/fptools/libraries/base/GHC/Read.lhs?rev=1.29;content-type=text%2Fplain

理解したら、是非チュートリアルを書いてくれ。
0813 ◆SaiTAMaVxg 2006/01/09(月) 08:32:36
                  ミ  (  ノ
                      / ̄\   ♪ 
                   〜(゚ ∀ 。 )⌒    
                 ♪   \_/  彡
                     ノ ι  ヽ

              ♪  .ハ
            ,ヘ    ((
            )ノ    .))
            (( ∧∧//
               \(゚∀゚ )      
              )  ノ         ヾ     ♪
          ミ シ´ /            ,γ 
         ミ r´  (          ∧∧//   
           ヽ、  ヽ  彡 ♪   ( ゚∀゚)'   
             )  ノ 彡       .,/   ヽ ミ
            ノ ,、(       ノ ノヽ   l
           r´/ ) )   ミ (´/  ノ ノ
          ( (  ( (         γ´ (´
           ヽ)  ヽ\       ノ ハ ヽ   ♪
               ノ  ) .   / ,,/ (,,ノ 彡
         ♪    (__ノ     (_,,ノ
0814デフォルトの名無しさん2006/01/22(日) 22:44:58
http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&lang=all
パフォーマンスが凄いことになってる。
0815デフォルトの名無しさん2006/01/23(月) 00:03:09
shootoutって、普通のプログラマが見ても
「Cはやっぱり速いなあ」とか「インタプリタはやっぱり遅いなあ」とか
「Javaはやっぱりメモリ喰いだなあ」とか思うだけで、
「関数型言語頑張ってるな。ちょっと使ってみるか」とは全く思ってくれない罠。
0816デフォルトの名無しさん2006/02/02(木) 21:41:39
複数の関数の挙動に影響を与える「オプション」を外部(コマンドラインとか)から指定したいとき
C++みたいな言語の「thisの省略」がすごく羨ましいんだけど、
似たようなことをHaskellっぽく書けないものだろうか。

implicit parameterでそれなりに書けそうだけど、
使われてるのを見たことがない。

みんな明示的に引数を持ち回るのが苦痛じゃないのか?
0817デフォルトの名無しさん2006/02/02(木) 23:15:17
>>816
そんな君にReaderT。
StateTでもいいぞ。
0818デフォルトの名無しさん2006/02/02(木) 23:46:36
>>817
おー、ありがとう。
この目的のためにReaderモナドで計算順序を導入するのには抵抗があったけど、
既にもなでぃっくなコードにReaderTを混ぜ込むなら面倒が少ないな。
0819デフォルトの名無しさん2006/02/05(日) 07:29:06
この言語は素晴らしいですか?
0820デフォルトの名無しさん2006/02/05(日) 07:47:59
最高ですかー!
0821デフォルトの名無しさん2006/02/05(日) 08:28:42
この言語の、C++に較べて、劣っている点を教えて下さい。
0822デフォルトの名無しさん2006/02/05(日) 10:42:57
・C++ではテンプレートを使ってコードの抽象性と実行時効率を両立できるけど、
Haskellでは困難。

・C++では名前空間・クラス・関数をかなり自由に相互ネストさせられるし、
ネストに従って細かくスコープを分けてくれるのに対して、
Haskellの名前空間はフラットで、レコードのフィールド名のスコープがモジュールレベルだったり、
関数に局所的な型の定義ができなかったりして不便。

・互いに関連のないものに同じ名前を与えるC++風の多重定義は難しい。
やってできないことはないけど、想定された言語の使いかたではないだろう。
0823デフォルトの名無しさん2006/02/06(月) 00:21:58
俺は今酔ってるし、ニートだし、最強だ。
モナディウスを参考にシューティングゲーム作るぞ。うぉー!
0824デフォルトの名無しさん2006/02/06(月) 00:33:36
>>823
マジ応援してる。
0825デフォルトの名無しさん2006/02/06(月) 03:51:37
出来上がったコードの実行速度はめっちゃ遅いですか?
0826デフォルトの名無しさん2006/02/06(月) 06:11:44
>>825
>>814
0827デフォルトの名無しさん2006/02/06(月) 07:33:29
Haskell Hackerが超がんばってキモいコード書けばgcc相当にはなるらしい。
俺のような凡人が普通に書いたらめっちゃ遅い。
0828デフォルトの名無しさん2006/02/06(月) 09:10:24
ハスケルハッカーがキモいコードを書けば、
バグは少ないわ高速だわの最強のコードが生成されるのですね?

それとも、キモいコードってのはバグを許す代わりに高速にするとかいう類の話?
0829デフォルトの名無しさん2006/02/06(月) 22:46:13
http://shootout.alioth.debian.org/gp4/benchmark.php?test=nbody&lang=java
http://shootout.alioth.debian.org/gp4/benchmark.php?test=nbody&lang=ghc&id=4

・コンパイルが大変で、
・コードが読みにくい分バグが多く、
・遅い
0830デフォルトの名無しさん2006/02/06(月) 23:05:14
確かに読みにくいね。

>・コンパイルが大変で、
どういう意味?
0831デフォルトの名無しさん2006/02/07(火) 05:53:35
ハスケル勉強したいが
参考書がきっと1万とか法外な値段でしょ?
手が出ません><
0832デフォルトの名無しさん2006/02/07(火) 06:09:11
数学やってる人がHaskellを直ぐに分かるのは、
集合論と一階述語論理について勉強済みだからなんだよね?
0833デフォルトの名無しさん2006/02/07(火) 10:27:09
もうすぐ青木さんの本とかが出るでしょ。
使うだけなら数学の話は特に必要ないよ。たぶん。
0834デフォルトの名無しさん2006/02/07(火) 11:00:55
数学の知識はいらないと思うけど、論理学の基礎なしじゃむりだぽ。
0835デフォルトの名無しさん2006/02/07(火) 16:18:33
数学に基づいて作られた言語ではあるが,その理念を理解して利用するのと,ただプログラミング言語として利用するのとでは意味が違う。
0836デフォルトの名無しさん2006/02/07(火) 16:28:17
「アルゴリズムのプロトタイピングなら C や Java よりも簡単で,早くできます」

とは大学の教官の弁。単位きたかなあ。
0837デフォルトの名無しさん2006/02/07(火) 16:54:31
早く作れても速く動かないのではなぁ…
08388232006/02/07(火) 17:13:22
>>837
みんなで速くするんだと思います><
CやFORTRANが速いのは多分歴史が長いからだと思ってる

--以下チラシの裏

今日やったこと:eclipseの日本語化とFPの導入

一言:eclipseをeclispだと思ってて「HaskellなのになんでLisp?」とか考えてた。英語弱いな、俺

今からやること:エヴァの映画借りてきて見る
0839デフォルトの名無しさん2006/02/07(火) 21:16:35
>>837
だからプロトタイピングなんだろ。
物好きがいろいろやってはいるけど、どう考えても研究用途の言語だよな。
だから意味がないというわけではないが。
0840デフォルトの名無しさん2006/02/07(火) 21:46:46
>>839
ちょっとお前は論点ずれてるよな。
0841デフォルトの名無しさん2006/02/07(火) 22:30:09
>>830
liftMとか素人なら完全に御手上げ。
あと、何この演算子?ってのを使ってる
(.|. (shiftL i 3)) -- google氏も無視

逆にhaskellが神言語になってる例
http://shootout.alioth.debian.org/gp4/benchmark.php?test=pidigits&lang=dlang&id=0
http://shootout.alioth.debian.org/gp4/benchmark.php?test=pidigits&lang=ghc&id=3
d 言語90行
haskell 11行
実行速度ほぼ同じ

理由
Integer型が使える
Monadを使う必要もMonad持ち上げをする必要がない。(配列を使う必要がない)
0842デフォルトの名無しさん2006/02/08(水) 18:30:21
>liftMとか素人なら完全に御手上げ。
たぶん、すぐ慣れると思う。

>(.|. (shiftL i 3)) -- google氏も無視
そんなあなたにHoogle
http://www.haskell.org/hoogle/?q=.%7C.
0843デフォルトの名無しさん2006/02/08(水) 21:20:50
>>842
すげー。
型から検索できるのがHaskellらしいな。
0844デフォルトの名無しさん2006/02/09(木) 09:48:51
みなさんは、式がどういう順番で評価されていくか
手にとるようにわかるのですか?
私はどう書いたら速いコードになるのかいまいちわかりません。
0845デフォルトの名無しさん2006/02/09(木) 13:07:28
評価順序など考えない。何のための遅延評価だと思っとる。

速いコードを書くのが目的なら関数型言語など、いや、
高級言語など使うのはお止めなさい。
0846デフォルトの名無しさん2006/02/09(木) 13:19:59
普段は評価順序なんか考えないでコーディングして、
効率が足らないことが分かったとき、そこをアセンブリで書き直す代わりに
既にあるHaskellのコードをいじって効率を確保する、というのは、
それなりに合理的だと思うんだが。
08478442006/02/09(木) 13:44:18
べつに速さで C と張り合おうとか思ってるわけではないのですが、例えばhead $ xs ++ [x]が O(1) かどうかというのは、評価順がわからないとわからないですよね?こういう簡単な例なら私にもわかるのですが、ちょっと複雑になると頭を抱えてしまうわけです。
08488232006/02/09(木) 14:15:14
>>847
多分、どんな順序で書いてもコンパイラが同じように並べかえてくれるんじゃないかなぁ?
コンパイラが考えうる中で最も効率的なコードが出るようにね
0849デフォルトの名無しさん2006/02/09(木) 14:16:51
>>847
非正格になれてないだけ。
0850デフォルトの名無しさん2006/02/09(木) 19:00:42
個人的経験では、Haskellerの半分はスピードレーサー(最適化おたく)だと思う。
0851デフォルトの名無しさん2006/02/09(木) 22:26:31
マシン非依存の部分ならば、
Cよりhaskellの方が速いコードが書けるはず。
なぜならば、見栄え良く、簡潔に書け(簡潔じゃないとコンパイルできない)
無駄なく書けるから。

cだと、綺麗なコードを書くために無駄なコードを書きまくると思うし、
汚い普通のコードを書いても、Haskellと同程度しか速くならない。

cの有利な点は、
gcがない, 配列操作, アセンブラ的コードが書ける, 速いライブラリがある。

と言ってみる。
0852デフォルトの名無しさん2006/02/09(木) 22:37:03
非正格だから遅いみたいな話は聞いた事がある。詳細は知らないけど。

>>851
>なぜならば、見栄え良く、簡潔に書け(簡潔じゃないとコンパイルできない)

これは速いコードとは関係ないんじゃないの?
早くコードを書く事は出来るのかもしれないが。
0853デフォルトの名無しさん2006/02/09(木) 22:37:18
「マシン非依存の部分」なんてあるのか?
0854デフォルトの名無しさん2006/02/09(木) 22:39:54
Haskellのソースはスリムだがバイナリがピザデブ杉。
0855デフォルトの名無しさん2006/02/09(木) 23:28:22
>>853
add
0856デフォルトの名無しさん2006/02/10(金) 03:01:51
Haskell学んでC++でメタプログラミング
これ最新最強。newなんていりませんから!
0857デフォルトの名無しさん2006/02/10(金) 10:53:42
なんでCはいつも最速なの?
0858fortran2006/02/10(金) 10:55:08
・・・
0859デフォルトの名無しさん2006/02/10(金) 12:50:24
最速はアセンブリ言語
0860デフォルトの名無しさん2006/02/10(金) 15:32:11
規模が大きければ
今となってはコンパイラが吐くアセンブラの方が速いことが多いけどね
0861デフォルトの名無しさん2006/02/10(金) 15:53:17
あらまあ何言ってるのかしらこの子ったら
0862デフォルトの名無しさん2006/02/10(金) 16:26:10
コンパイラに負けるなんて、無能を証明してるようなもんだろ。
0863デフォルトの名無しさん2006/02/10(金) 16:27:27
>>857
危険だからさ。
お行儀の良いハスケルにはわからんだろうがね。
0864デフォルトの名無しさん2006/02/10(金) 16:40:00
>>856
バカですか

>>857
バカですか

>>859
バカですか

>>862
バカですか

Haskellに関しての議論としては論点がずれているぞ。
Haskellを創った人たちは、お前らが気にしていることはすべて解っているし、そんなことを解決するための言語にしようとは考えていないんだよ。
言語仕様に関しては。言語仕様という表現も好きじゃないけど。
0865デフォルトの名無しさん2006/02/10(金) 16:49:34
へぇ、、ハスケルって読むんだぁ。。
アライグマみたいだね。
0866デフォルトの名無しさん2006/02/10(金) 16:54:41
>>864
必死だな。

マジレスすると、「Haskellを創った人たち」の意図などどうでも良い。
いったん言語ができあがってしまえば、それをどう使おうが勝手だ。
0867デフォルトの名無しさん2006/02/10(金) 16:59:56
ネタっぽいんだが
0868デフォルトの名無しさん2006/02/10(金) 18:57:08
Haskellを作った人達って誰になるのかな。
Hudak? Peyton Jones? Wadler?
08698442006/02/10(金) 21:21:30
あれれ、なんだか私の質問で荒れちゃったみたいで申し訳ない。

>>849
これでも、もう一年以上使ってるんですよ。ヘボプログラマーなもんで...。
0870デフォルトの名無しさん2006/02/10(金) 22:11:16
書いたとおりに動くCとかと違って,書いたコードよりオーダー単位で計算量が
小さくなる可能性がある Haskell には期待してるんだがなあ.
0871デフォルトの名無しさん2006/02/10(金) 22:23:04
O'Camlはむちゃくちゃ早いらしいけど、Haskellとは何が違うんだろう。
0872デフォルトの名無しさん2006/02/10(金) 22:42:30
>>871

http://wiki.ocaml.jp/index.php?%B4%D8%BF%F4%B7%BF%B8%C0%B8%EC%A4%CE%C8%E6%B3%D3

デフォルトで遅延評価なのか、指定したときだけ遅延評価なのか。
破壊的代入を許さないのか、許すのか。

速度に影響しそうな所というとこの辺の違いかな?
0873デフォルトの名無しさん2006/02/10(金) 22:46:32
>>870
そんな激しい最適化をするHaskellコンパイラはないと思うが。
0874デフォルトの名無しさん2006/02/10(金) 23:59:12
Hudakじゃないだろ。やっぱりSPJが筆頭なんじゃない?
0875デフォルトの名無しさん2006/02/11(土) 00:19:45
なんかShootoutのページで、あれ、Haskell速いじゃんと思ったら、
極端に遅い欠点がないのと、重みが高い数個のプログラムで稼いでるだけ
みたいだな。勝ってる数だけで見たらJavaにも勝てない。
0876デフォルトの名無しさん2006/02/11(土) 05:57:50
ふつうの本は五月に延期だそうな。
0877デフォルトの名無しさん2006/02/11(土) 09:05:41
take 5 $ reverse $ reverse [1..]
で死にやがった。遅延評価も万能じゃないんだな。
0878デフォルトの名無しさん2006/02/11(土) 09:28:58
Haskellでは

reverse $ reverse ≡ id

だからなあ。
0879デフォルトの名無しさん2006/02/11(土) 09:29:52
> reverse $ reverse ≡ id
reverse $ reverse ≠ id

の間違い。
0880デフォルトの名無しさん2006/02/11(土) 11:29:59
reverse :: [a] -> [a]
reverse xs returns the elements of xs in reverse order. xs must be finite.
0881デフォルトの名無しさん2006/02/11(土) 11:41:15
>>875
だけって・・・

俺の感覚ではそういうのは、
「なんでもそつなくこなす優秀なやつ」だよ。

一番になること以外には意義を感じないのかい?
0882デフォルトの名無しさん2006/02/11(土) 12:26:06
>>881
でも半分以上は平均的に結構遅いんだよ。。。
他の言語みたいに極端に遅いってのはないけど、
そういうのはアルゴリズムの欠陥があったり、その言語での普通の
やり方と違うといった何かしらの事情があることが多いし。
0883デフォルトの名無しさん2006/02/11(土) 16:01:00
No JDK -server
ってあるのはJDKでは苦手分野の可能性が高い。

負けてる sum-file や random なんて Cleanがトップだから、
似たようにやれば(内部含む)haskellでもトップになる可能性はある。
(reverse-components はocaml 一位 Clean2位)

javaには負けてるとはいえない。
0884デフォルトの名無しさん2006/02/11(土) 16:42:24
Haskell最速! 欠点なし!
この訴えはム板のあらゆるスレで続けていくつもりです。
0885デフォルトの名無しさん2006/02/11(土) 16:51:19
自分が作ったものでもないのにそんな風に誇られても。
0886デフォルトの名無しさん2006/02/11(土) 16:53:58
>>884
頑張れ
Lisp厨やRuby厨に負けるなよ
0887デフォルトの名無しさん2006/02/11(土) 17:34:34
shootoutのあれは、言語の優劣よりもcommunityの熱意とかを反映している気がする。
0888デフォルトの名無しさん2006/02/11(土) 18:32:12
>>884
訴えにはそれ相応の証拠がいるんだ。
説得力がある資料を添えて出直せ。
0889デフォルトの名無しさん2006/02/11(土) 19:54:29
証拠はshootout
0890デフォルトの名無しさん2006/02/11(土) 20:01:18
確かにshhotoutだとcより速いことになってるなwww
0891デフォルトの名無しさん2006/02/11(土) 20:04:00
姉は一級Haskeller 〜イケナイSTG-Machine
0892デフォルトの名無しさん2006/02/11(土) 20:09:58
>>890
CPU Timeの重みを1にして他を0にしてみ。

OCaml 34.77 1
C gcc 32.82 3
D Digital Mars 29.86 2
Haskell GHC 28.69 0
C++ g++ 25.76 2
SML MLton 24.70 3
Eiffel SmartEiffel 24.36 5
Nice 23.45 3
Java JDK 1.4 -server 22.21 4
Clean 22.01 6
Java JDK -server 21.87 4
Ada 95 GNAT 20.25 4
Java JDK -client 18.84 4
Fortran G95

まあでも正直、この順位も絶対現実とはかけ離れてるよな。
やっぱ、コミュニティの熱意とかが反映されるんだろうな。
0893デフォルトの名無しさん2006/02/11(土) 20:20:21
>>892
>Nice 23.45 3

プログラミング言語Nice (ワラ
0894デフォルトの名無しさん2006/02/11(土) 20:35:56
だから、Shootoutは時々極端に遅いところがあるから
そういう変な順位になる。

例えば、CとHaskellを見るとCのchameneosとregex-dnaが
極端に遅いことがわかる。
こういうのはアルゴリズムの欠陥か何かの特殊事情だから除いて
考えるべきだというのは、具体的な数値を見てみるとよくわかるだろう。
0895デフォルトの名無しさん2006/02/11(土) 21:07:44
まあ、Cだと書きにくいからアルゴリズムの欠陥が生まれるわけだ。
0896デフォルトの名無しさん2006/02/11(土) 21:09:32
それもあるだろうが、コミュニティの熱意が大きいだろ。
いずれにせよ本来の速さとは違うだろう。
0897デフォルトの名無しさん2006/02/11(土) 21:12:07
FortranがJavaより下とか、そういうの見ても相当いい加減な
順位であることがわかるな。
0898デフォルトの名無しさん2006/02/11(土) 22:00:20
CとかFortranとか手書きアセンブリとか:熱意に対して指数関数的に速くなる
OCamlとかCleanとかHaskellとか:凡人がやっつけ仕事してもそこそこ速い

ってことでFA?

スレ違いだけど、今日初めてGoogle Earthをインスコしたんだ。
超セクシーだね! あんなのをHaskellで書いてみたい
0899デフォルトの名無しさん2006/02/11(土) 22:08:03
ワラ^^;
0900デフォルトの名無しさん2006/02/11(土) 22:46:14
>>898
後者は言語オタク・エキスパート・信者が、Shootoutのために
必死になってソース作ってそうだけどなw
0901デフォルトの名無しさん2006/02/11(土) 22:46:47
はっきり言って、速いとか遅いとかどうでもいい
0902デフォルトの名無しさん2006/02/11(土) 22:47:40
しかし最適化には興味があるという矛盾 誰か俺を(ry
0903デフォルトの名無しさん2006/02/12(日) 01:24:02
こんなの見つけた。
http://item.rakuten.co.jp/book/1794880
0904デフォルトの名無しさん2006/02/12(日) 05:16:07
まあ、DとかC++とかにHaskellが対抗してる時点で
あきらかに実力以上の評価なわけで。
素人が普通に作ったらJavaといい勝負ってのが正直な感想。
0905デフォルトの名無しさん2006/02/12(日) 09:51:08
東大生みたいな言語だな。
ノーベル賞とまではいかないがなかなか強力に安定した結果を叩きだし、堅物で融通がきかない。
0906デフォルトの名無しさん2006/02/12(日) 12:18:48
いや、Haskell自身が速いってことはないと思う。
確かに言語仕様が優れていて、使ってる人が非常に優秀なのは
確かなんだが、速くはない。
Shootoutがいい成績なのも使ってる人が優秀なのと、他の言語が
力入れてないだけ。
0907デフォルトの名無しさん2006/02/12(日) 12:33:29
てか、実は>>892は数日前までDやOCamlに勝ってた。
つまり、まだまだ未成熟段階ってこと。
Shootoutの順位なんてそんなもん。
0908デフォルトの名無しさん2006/02/12(日) 12:38:23
あほな速度評価結果はってんなよ。
血液型占いと同じぐらいオカルト。
バカですか。
レス数が900を超えています。1000を超えると表示できなくなるよ。