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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2013/10/25(金) 21:54:29.92
関数型プログラミング言語 Haskellについて語るスレです。

前スレ: 関数型プログラミング言語Haskell Part23
http://toro.2ch.net/test/read.cgi/tech/1376111807/

haskell.org
http://www.haskell.org/

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

過去ログ (10〜)
Part21 ttp://toro.2ch.net/test/read.cgi/tech/1358702176/
Part20 ttp://toro.2ch.net/test/read.cgi/tech/1350428908/
Part19 ttp://toro.2ch.net/test/read.cgi/tech/1340760070/
Part18 ttp://toro.2ch.net/test/read.cgi/tech/1331902463/
Part17 ttp://toro.2ch.net/test/read.cgi/tech/1325510368/
Part16 ttp://toro.2ch.net/test/read.cgi/tech/1317958045/
Part15 ttp://hibari.2ch.net/test/read.cgi/tech/1310199414/
Part14 ttp://hibari.2ch.net/test/read.cgi/tech/1299385928/
Part13 ttp://hibari.2ch.net/test/read.cgi/tech/1286706874/
Part12 ttp://hibari.2ch.net/test/read.cgi/tech/1272536128/
Part11 ttp://pc12.2ch.net/test/read.cgi/tech/1252382593/
Part10 ttp://pc12.2ch.net/test/read.cgi/tech/1231861873/
0159デフォルトの名無しさん2013/11/03(日) 06:24:19.90
ちなみに各バージョンは
ghc-7.4.2
hint-0.3.3.7
cabal-install 1.16.0.2
Cabal library 1.16.0.3
Mac OS X 10.9
です
0160デフォルトの名無しさん2013/11/03(日) 08:35:05.82
>>158
試してみたけどparseModeの型が変わっててコンパイルできない
>Warning: Language.Haskell.Interpreter: could not find link destinations for:
>Hint.Base.FromSession Hint.Base.ModifySessionRef Hint.Base.RunGhc
>と言われました
これはhaddockの警告だから無視して良い
0161デフォルトの名無しさん2013/11/03(日) 09:37:56.05
>>158
ParseModeのところを直して、
H.set [H.languageExtensions H.:= [H.ImplicitParams]]
の行をコメントアウトしたら動いた
0162デフォルトの名無しさん2013/11/03(日) 12:02:31.92
ghciの:tはどういう仕組みで型を調べているのでしょうか?

   import qualified Data.Text as T

   content :: Cursor -> [T.Text]

と書いてあるのに、:t contentで型を調べると

   content :: Cursor -> [Data.Text.Internal.Text]

になります
0163デフォルトの名無しさん2013/11/03(日) 12:27:14.55
www.haskell.org/ghc/docs/latest/html/users_guide/ghci.html
どうぞ
0164デフォルトの名無しさん2013/11/03(日) 12:28:11.58
>>162
ghcは内部的にはあらゆる型をそれが定義されたモジュールと合わせて区別する
xml-conduitをコンパイルした時点で、xml-conduit内の関数それぞれの型が
hiファイルに記録される。たとえば
content :: Text.XML.Cursor.Cursor -> [Data.Text.Internal.Text]
みたいに型情報が入ってる。(hiファイルはghc --show-ifaceで読める)
ghciは、これを読んで、なるべく分かり易いように表示する
Text.XML.Cursor.Cursorは、スコープにある型なので、単に「Cursor」と表示する
Data.Text.Internal.Textは、スコープにないので、そのまま「Data.Text.Internal.Text」になる
0165デフォルトの名無しさん2013/11/03(日) 12:34:55.62
>>164
わかりやすい
0166デフォルトの名無しさん2013/11/03(日) 12:43:45.19
自演乙
>>162
>>164
>>165
0167デフォルトの名無しさん2013/11/03(日) 12:51:12.74
なんでも自演に見えるのは病気だよ
0168デフォルトの名無しさん2013/11/03(日) 12:53:08.69
自演だろうと、そうでなかろうと、どういう文体だろうとどうでもいい

情報だけが大事

手紙じゃないんだから
0169デフォルトの名無しさん2013/11/03(日) 12:55:57.70
いや、昨日の自演の続きかと思って
0170デフォルトの名無しさん2013/11/03(日) 13:05:53.98
自演乙
本人乙

常套句でつね
01711622013/11/03(日) 13:18:18.23
>>163
全部調べましたがどこにも":t"の仕様に関する情報はありませんでした

>>164
> たとえば
> content :: Text.XML.Cursor.Cursor -> [Data.Text.Internal.Text]
> みたいに型情報が入ってる。

ソースコードには
   import qualified Data.Text as T
   content :: Cursor -> [T.Text]
と書いてあるのに、なぜ
   [Data.Text.Internal.Text]
として型情報が記録されるのかがわかりません。
0172デフォルトの名無しさん2013/11/03(日) 13:24:27.16
それはそうとぉ、 :l *Main.hs、:m *Module みたいにしてやるとぉ、
:tでちゃんと型だけの表示になると思うんだけどぉ、俺の環境だけかなぁ?
みんなも試してみてよぉ
0173デフォルトの名無しさん2013/11/03(日) 13:35:53.92
>>171
T.Textは、Data.TextからエクスポートされているTextという名前を参照する構文
で、Data.TextがエクスポートするTextは何かと言うと、
Data.Text.Internalで定義されたTextという型(これはData.Textのhiファイルに書いてある)
Data.Textのソースを見れば、Data.Text.InternalからインポートしたTextを
そのままエクスポートしてるのが分かる
0174デフォルトの名無しさん2013/11/03(日) 13:45:36.05
>>173

俺は >>162 とは別人だが、ちょっと質問。

content :: Cursor -> [T.Text] の
Text.XML.Cursor.Curdor 型の方はなぜ
Text.XML.Cursor.Generic.Cursor と表示されない?
01751742013/11/03(日) 13:48:20.91
>>173
あ、ごめん、分かった

Text.XML.Cursor.Curdor 型の方は
type Cursor = CG.Cursor Node と型シノニムが定義されて、
それがエクスポートされているからか
01761622013/11/03(日) 14:52:09.40
>>173
ようやくわかったよありがとう。
Haskell何も知らん人に丁寧に教えてくれてありがとうw
0177デフォルトの名無しさん2013/11/03(日) 16:06:44.34
結局既存のプログラムを置き換えようとすると
手続きっぽく書くことになるのかな
0178デフォルトの名無しさん2013/11/03(日) 16:23:23.81
どんなプログラムでも関数的な書き方と手続き的な書き方の混合になるよ
混合比はプログラムの種類によって違うけど、手続き一辺倒になることは滅多にない
0179デフォルトの名無しさん2013/11/03(日) 16:28:29.29
そそ、結局ラムダになるよね、基本
0180デフォルトの名無しさん2013/11/03(日) 16:36:58.18
例えば編集距離を求めるコードはこうなる

levenshtein2 sa sb = last $ foldl transform [0..length sa] sb
 where
  transform xs@(x:xs') c = scanl compute (x+1) (zip3 sa xs xs')
   where
    compute z (c', x, y) = minimum [y+1, z+1, x + fromEnum (c' /= c)]
0181デフォルトの名無しさん2013/11/03(日) 16:58:16.40
>>179
関数ポインタを持ってるC言語こそが本当の関数型ということになる
0182デフォルトの名無しさん2013/11/03(日) 18:02:54.79
>>181
C言語が持てる関数ポインタの数はソースにより上限が決まる
本当の関数型なら有限のソースから無限に異なる関数を生成できる

突き詰めると、関数に必ず名前をつける言語は本当の関数型ではないってこと
0183デフォルトの名無しさん2013/11/03(日) 18:23:32.74
>>182
C言語は、引数としての関数の記述には制限はない
0184デフォルトの名無しさん2013/11/03(日) 19:27:28.45
C言語が実際には関数型かどうかなんて、このスレ的にはどうでもいいこと
Haskellの話とは何の関係もない
(C言語が関数型だろうと、Haskellには何の影響も及ぼさない)

新しくスレを作ってそちらで大いに議論してもらいたい
0185デフォルトの名無しさん2013/11/03(日) 19:35:49.74
void *(*f)(void *(*)(void *(*)(void *(*)(void *(*)(void *(*)(void *(*)(void *(*)(...))))))));

こういうのって何段まで書けたっけ
0186デフォルトの名無しさん2013/11/03(日) 19:38:13.35
>>184
Haskell言語の特徴として関数型言語であることを挙げるのはやめるべき
より純粋な関数型言語のCがあるんだから
0187デフォルトの名無しさん2013/11/03(日) 19:41:09.92
やめるかどうかはともかく、関数型という一面が強調されすぎの感はある
0188デフォルトの名無しさん2013/11/03(日) 20:05:30.63
でかい釣針だな。
http://ja.wikipedia.org/wiki/%E9%96%A2%E6%95%B0%E5%9E%8B%E8%A8%80%E8%AA%9E
から抜粋
>手続き型プログラミングなどにおける「関数」ではないことをまず注意する。
0189デフォルトの名無しさん2013/11/03(日) 20:10:06.02
>>184
> (C言語が関数型だろうと、Haskellには何の影響も及ぼさない)

ダウト
関数型言語のシェアという点では関数型言語Haskellに大いに関係ある話題である
0190デフォルトの名無しさん2013/11/03(日) 20:10:29.19
ならモナドやめろって話だよ
0191デフォルトの名無しさん2013/11/03(日) 20:22:57.55
モナドは型クラスだから
曖昧なパラダイムや変動するシェアによって定義が変わることはない
そういう影響は受けない
0192デフォルトの名無しさん2013/11/03(日) 20:47:59.08
モナドなんて構造の一つの表現にすぎないだろ
べつにHaskellに限った仕組みじゃなし
0193デフォルトの名無しさん2013/11/03(日) 21:29:41.73
手続きとかいう曖昧な言葉を厳密な型であるIOモナドで表現した

人間が手続きを差別したり見下したりする必要はなくなり
コンパイラが機械的にチェックすればいいだけになるはずだった
0194デフォルトの名無しさん2013/11/03(日) 22:46:38.09
haskellから遅延評価を排除したら何が残る?ラムダも破綻するだろ?
0195デフォルトの名無しさん2013/11/03(日) 22:52:31.32
>>194
データ操作をデータ構造が分離した近代言語
0196デフォルトの名無しさん2013/11/03(日) 23:08:35.29
>>189
Haskellのシェアも、このスレではどうでもいい
なんでそんな話をする?

この言語を使って実際にプログラムする事に関係ある話をしろよ
0197デフォルトの名無しさん2013/11/03(日) 23:12:57.59
>>196
Haskellを使って実際にプログラミングするためには、機械語のレガシーソフトすら存在する現場において、Haskellの有用性と位置付けと言語的特徴を他の言語と比較して説明しなければならない

実際の労力に換算したら、その説得こそがHaskellプログラミングと言える
0198デフォルトの名無しさん2013/11/03(日) 23:26:30.51
>>197
そういう事なら、他の言語と比較する事を手段として、
「Haskellの有用性と位置付けと言語的特徴」の話をちゃんとしてほしい

関数型とか手続き型とか、より純粋な関数型言語とか、
そんな名称の定義は一定していないし、綺麗に分けられるものではないのだから、
たとえば「Haskellは**をするのに〜〜と書ける」というような
実際のプログラミングで優位性や特徴を語るべきだと思う

それと、シェアの話しならマ板でやってほしい

単なる一住人のわがままなので、これ以上は何も言わないでおく
0199デフォルトの名無しさん2013/11/03(日) 23:33:22.04
>>198
実際の現場では、名称の定義も綺麗な分類も必要ない
特にクライアントに納入するコードの説得に必要なのは、シェアの話以外にない
0200デフォルトの名無しさん2013/11/03(日) 23:42:01.94
>>199
そういうのはいつだって自慢話に帰着して終了なんだけど。
0201デフォルトの名無しさん2013/11/04(月) 00:43:46.57
今まで一部の人間がひっそりと優越感に浸りながらオナニーしてたけど
馬鹿に見つかってしまって必死にその世界を守ってるという言語
0202デフォルトの名無しさん2013/11/04(月) 00:49:29.58
と馬鹿が申しております
0203デフォルトの名無しさん2013/11/04(月) 01:56:19.33
>>199
もし仮にコンピュータ言語のことで自慢できる立場の人がこのスレを見てるなら、スレ関係なくどんどん書きこんでほしいと思うのは俺だけか
0204デフォルトの名無しさん2013/11/04(月) 06:55:18.40
>>194
型クラス、軽量スレッド、do記法、純粋性、ユーザ定義演算子、STM…
挙げればきりがない
0205デフォルトの名無しさん2013/11/04(月) 07:12:28.92
javascriptの悪口なんて誰も言ってないのに何でHaskellを叩くのだろうか
UHC,Fay,GHCJSとかあるのに
0206デフォルトの名無しさん2013/11/04(月) 07:28:16.61
オナニー言語
0207デフォルトの名無しさん2013/11/04(月) 07:32:24.20
袋入り食パンのあれ、バッグクロージャって言うらしいね
どことなく関数型ぽくね?
0208デフォルトの名無しさん2013/11/04(月) 08:11:05.74
つまりクロージャもラムダも高階関数もあるJavaScriptは関数型かつオナニー言語ってことだな
0209デフォルトの名無しさん2013/11/04(月) 08:18:41.17
閉包ー閉包ー関数が好きー
0210デフォルトの名無しさん2013/11/04(月) 08:25:33.47
>>198
自分が気に入らない話題の時は黙ってスルーするだけでなく
「俺の好きな話題以外は一切出すな!」って

大丈夫か?
社会生活的に。
0211デフォルトの名無しさん2013/11/04(月) 08:37:32.13
自演評価
0212デフォルトの名無しさん2013/11/04(月) 11:54:30.30
>>205
>javascriptの悪口なんて誰も言ってないのに
えっ
>JavaScript sucks. The depths to which JavaScript sucks is well-documented and well-understood.……
http://www.haskell.org/haskellwiki/The_JavaScript_Problem
0213デフォルトの名無しさん2013/11/04(月) 12:07:51.38
遅延評価だけに後回し後回しの人生です
0214デフォルトの名無しさん2013/11/04(月) 12:16:34.21
>>213
Haskellは必要なときには過不足なく仕事してるんだよ

お前は必要な時もサボってるだろ
0215デフォルトの名無しさん2013/11/04(月) 12:22:38.14
ここはHaskellで書くスーパーハッカー的プログラムを公開するスレです
0216デフォルトの名無しさん2013/11/04(月) 12:32:59.81
>>215
そう言うあなたがスーパーハッカー的プログラムを一切公開しない理由を説明してほしいです
0217デフォルトの名無しさん2013/11/04(月) 14:16:01.11
よくいるよね
高価な文房具を買いそろえ、勉強はあまりしない
高価なギターやエフェクター類をそろえるが練習しない
0218デフォルトの名無しさん2013/11/04(月) 14:22:23.79
10年ぐらいたって突然それらが遅延評価されて練習が始まるのです
0219デフォルトの名無しさん2013/11/04(月) 14:56:47.74
ワロスwwwww
0220デフォルトの名無しさん2013/11/04(月) 15:29:14.44
遅延評価とか言ってる割には

fib n = fib(n-2) + fib(n-1)
fib 1 = 1
fib 2 = 1

とかできなくて残念な言語
0221デフォルトの名無しさん2013/11/04(月) 15:47:35.09
>>220
試してみたら普通に動いたよ
0222デフォルトの名無しさん2013/11/04(月) 15:55:52.45
>>221
この定義の順番では「Pattern match(es) are overlapped」でまともに動きません。
fib 1 と fib 2 の定義を fib n の定義より先に書けば動きます。

>>220 は「遅延評価」をなにか別のものと勘違いしているか、
勝手に拡大解釈して期待してたのに思い通りにならなくて落胆しているか、どちらかです。
0223デフォルトの名無しさん2013/11/04(月) 16:03:31.69
>>220
ご覧の通り

ghci>:{
Prelude| let {
Prelude| fib 1 = 1;
Prelude| fib 2 = 1;
Prelude| fib n = fib (n-2) + fib (n-1)
Prelude| }
Prelude| :}
ghci>fib 1
1
ghci>fib 2
1
ghci>fib 3
2
ghci>fib 4
3
ghci>fib 5
5
ghci>fib 6
8
ghci>fib 10
55
ghci>fib 100
^Z
[1]+ 停止
0224デフォルトの名無しさん2013/11/04(月) 16:36:21.66
欠陥を指摘してドヤ顔しようとしたら言語の基本を知らなかっただけの>>220が涙目すぎてつらい
0225デフォルトの名無しさん2013/11/04(月) 16:40:46.50
なんかすごい深い話かと思って二度見したわ
パターンマッチの規則も知らん奴に涙目とか言われても反応に困る
0226デフォルトの名無しさん2013/11/04(月) 16:55:30.00
Backpack: retrofitting Haskell with interfaces
research.microsoft.com/en-us/um/people/simonpj/papers/modules/

へーHaskellのモジュールシステムってそんなに弱いんだー
知らなかったー
0227デフォルトの名無しさん2013/11/04(月) 19:03:28.46
メモ化の話を蒸し返してきたのかと思ったらそれ以前の関数型ワナビだった
0228デフォルトの名無しさん2013/11/04(月) 19:42:59.03
SMLやOCamlに比べればモジュールシステムが弱いのは有名
かと言って強いモジュールシステムが欲しいという声もそんなに聞かないけど
0229デフォルトの名無しさん2013/11/04(月) 19:50:47.10
>>228
確かにmoduleシグネチャは強力だけど
ocamlはocamlでコンパイル順序の問題があるからな・・・
0230デフォルトの名無しさん2013/11/04(月) 19:57:14.35
>>217
やめろ!
0231デフォルトの名無しさん2013/11/04(月) 20:00:20.72
>>217
逆に色々不完全な奴ほど精力的だよな。
脳が不完全で矛盾だらけなやつほど行動力がある。
0232デフォルトの名無しさん2013/11/04(月) 20:02:02.66
遅延するし必要なときは仕事するけど、不要な時も暇なら気まぐれで仕事するよって機構はないの?
ガベコレにいいと思うんだ
0233デフォルトの名無しさん2013/11/04(月) 20:24:42.41
ガベコレは最近は排除の流れだがよろしいか
0234デフォルトの名無しさん2013/11/04(月) 20:37:01.15
目の前の戦いに集中するのが完璧に正解
戦いが終わった後のために買い物したらどうなるか気付かない奴は不完全
0235デフォルトの名無しさん2013/11/04(月) 20:54:19.29
>>234
つまり極論すれば知識や経験などは余計な物というわけですね。
0236デフォルトの名無しさん2013/11/04(月) 21:28:54.99
必要だから持ってる知識と、ただ何となく持ってる知識を区別しない
0237デフォルトの名無しさん2013/11/04(月) 22:02:37.50
replで
let result = f x -- fは何か物凄く重い処理
とやって、すぐにプロンプトが帰ってきたので、haskellスゲーと思って、resultの中身みたら長々と重い処理が始まった

これが遅延評価
0238デフォルトの名無しさん2013/11/04(月) 22:03:02.68
knowledge is not orange.
0239デフォルトの名無しさん2013/11/04(月) 22:59:28.85
a = [0, [1, [2, null]]];
a[1][1][1] = a;
循環するデータ構造を作りたいとき
遅延評価がないとnullと代入が出てくる
0240デフォルトの名無しさん2013/11/04(月) 23:31:37.28
ふむ
0241デフォルトの名無しさん2013/11/05(火) 08:24:52.57
>>237
これマルチコアプログラミング時の落とし穴なんですよね
リワハざっと読みましたけど
0242デフォルトの名無しさん2013/11/05(火) 11:22:49.67
Futureとは違う
0243デフォルトの名無しさん2013/11/05(火) 12:13:31.95
deepsecしましょ
0244デフォルトの名無しさん2013/11/05(火) 15:24:04.13
Haskell Platform 2013.4.0.0 のリリース予定昨日だったけど遅れてんのかな
0245デフォルトの名無しさん2013/11/05(火) 17:52:50.61
Haskell Platform のリリースが予定から遅れるなんていつもの事
0246デフォルトの名無しさん2013/11/05(火) 23:09:14.28
リリースも遅延評価なので
0247デフォルトの名無しさん2013/11/06(水) 01:58:38.62
今まで開発さぼってたんかい!
0248デフォルトの名無しさん2013/11/06(水) 04:59:36.76
バグの追求に時間がかかっているんだよ。
オナニー言語らしいじゃないか。
0249デフォルトの名無しさん2013/11/06(水) 07:55:25.42
人ば…アーリーアダプター言語らしい
0250デフォルトの名無しさん2013/11/08(金) 21:15:33.74
正式版をリリースした後にキャンセルして、一ヶ月後にβ版からリリースし直した言語もあるんですよ!
0251デフォルトの名無しさん2013/11/08(金) 23:16:48.08
AnyやAllの用途って何ですか?
0252デフォルトの名無しさん2013/11/08(金) 23:59:41.00
Anal の用途なら分かるのだが…
0253デフォルトの名無しさん2013/11/09(土) 00:44:19.30
リスト以外のデータ構造をFoldableにしてfoldMapしたりするんじゃないの?
http://hackage.haskell.org/package/base/docs/Data-Foldable.html
0254デフォルトの名無しさん2013/11/10(日) 23:44:51.91
ThreadScopeでCPU(コア)の使い方を調べている時、
グラフのどの部分がプログラムソースのどの辺りの計算をしている時のものか
予想がつく場合もあれば、なかなか分からない場合もあります。

プログラムソースの中に、なにか目印を付けて、イベントログにその情報を出力し、
ThreadScopeで見た時にその目印がグラフ上に表示されるような事はできるでしょうか。
0255デフォルトの名無しさん2013/11/11(月) 20:20:01.92
>>254
Debug.Trace.traceEvent
0256デフォルトの名無しさん2013/11/11(月) 20:54:46.28
>>255
ありがとうございます。

これで作業がはかどります。
0257デフォルトの名無しさん2013/11/11(月) 23:33:16.27
Codec.Image.DevIL パッケージの Codec.Image.DevIL.writeImage 関数について質問です。

この関数で画像ファイルを出力するとき、すでに同じパスのファイルが存在すると、
上書きされずに関数から返ってきます。
エラーも何も起こりません。

新しい画像データで上書きしたように見せかけるには、
もしすでに同じパスのファイルが存在するなら、この関数を使う前に
そのファイルを削除しておくという方法があります。

しかしこの場合、もし writeImage 関数の内部で何かエラーが起きて関数が中断されても、
先に消したファイルは取り戻せません。

writeImage 関数で上書きするもっと良い方法はないでしょうか。
このパッケージの使用はあきらめて、別の画像書き込み用パッケージを探すべきでしょうか。
0258デフォルトの名無しさん2013/11/11(月) 23:37:29.60
>>257
ファイルを別名に変えればいいじゃん。
■ このスレッドは過去ログ倉庫に格納されています