関数型プログラミング言語Haskell Part16
■ このスレッドは過去ログ倉庫に格納されています
0001a36 ◆K0BqlCB3.k
2011/10/07(金) 12:27:25.71ttp://www.haskell.org/
日本語サイト
ttp://www.sampou.org/cgi-bin/haskell.cgi
ttp://www.shido.info/hs/
過去ログ
関数型プログラミング言語Haskell
Part1 ttp://pc.2ch.net/tech/kako/996/996131288.html
Part2 ttp://pc2.2ch.net/test/read.cgi/tech/1013846140/
Part3 ttp://pc8.2ch.net/test/read.cgi/tech/1076418993/
Part4 ttp://pc8.2ch.net/test/read.cgi/tech/1140717775/
Part5 ttp://pc8.2ch.net/test/read.cgi/tech/1149263630/
Part6 ttp://pc11.2ch.net/test/read.cgi/tech/1162902266/
Part7 ttp://pc11.2ch.net/test/read.cgi/tech/1174211797/
Part8 ttp://pc11.2ch.net/test/read.cgi/tech/1193743693/
Part9 ttp://pc11.2ch.net/test/read.cgi/tech/1211010089/
Part10 ttp://pc12.2ch.net/test/read.cgi/tech/1231861873/
Part11 ttp://pc12.2ch.net/test/read.cgi/tech/1252382593/
Part12 ttp://hibari.2ch.net/test/read.cgi/tech/1272536128/
Part13 ttp://hibari.2ch.net/test/read.cgi/tech/1286706874/
Part14 ttp://hibari.2ch.net/test/read.cgi/tech/1299385928/
Part15 ttp://hibari.2ch.net/test/read.cgi/tech/1310199414/
0357デフォルトの名無しさん
2011/11/04(金) 10:35:20.27schwa音だから、母音はどうでもいい。
0358デフォルトの名無しさん
2011/11/04(金) 12:32:15.54もっと Haskell の何かを表した、言い得てみょんな当て字があるといいんだけどなぁ
bookkeeping -> 簿記
function -> 函数
みたいに
0359デフォルトの名無しさん
2011/11/04(金) 12:50:46.86治具とjigとか
0360デフォルトの名無しさん
2011/11/04(金) 13:01:35.960361デフォルトの名無しさん
2011/11/04(金) 13:01:42.730362デフォルトの名無しさん
2011/11/04(金) 13:33:58.200363デフォルトの名無しさん
2011/11/04(金) 17:15:28.220364デフォルトの名無しさん
2011/11/04(金) 17:15:46.200365デフォルトの名無しさん
2011/11/04(金) 23:08:47.74必ずミュータブルな操作を持つデータ型を使わないといけないのか、
それともIOモナドやSTモナドの中に入れてしまうだけでいいのでしょうか。
例えば配列でMArrayを使わずに、
IORef (Array Int Int)みたいなデータ型を用意して、
IOモナドの中でmodifyIORef x (// y)としても、配列を新しく作り直さずにxを更新できたことにはなるんでしょうか?
0366デフォルトの名無しさん
2011/11/05(土) 10:51:35.93IORefはポインタ
writeIORefで破壊的に更新できるのはポインタ部分だけで、
中身を破壊できる訳ではない
modifyIORef x (//y)とすると、新しい配列(を作るサンク)が作られた上で、
xがそれを指すように更新される
0367デフォルトの名無しさん
2011/11/05(土) 16:31:37.95やっぱり駄目かー。
0368デフォルトの名無しさん
2011/11/05(土) 18:33:22.15新しい実体といっても、後ろに追加する以外でも、メモリ上で共有される実装であれば、
参照は遅いけど、更新が軽いという場合があるよ。
0369デフォルトの名無しさん
2011/11/05(土) 19:05:50.19>LinuxやMac OS XなどのUnix環境では,ロケール(locale)の設定を見て自動的に適切な文字コードに変換してくれます。ロケールは,言語や時刻など,使用しているOSのローカルな設定を決めるためのものです。
>Prelude System.IO> putStrLn "テスト"
>テスト
>一方,Windowsでは,UTF(UCS Transformation Format)とHaskellプログラム内部の文字コードとの間で変換を行うことはできますが,技術的な問題からShift_JIS(Microsoftコード・ページ932)のような2バイト文字ではまだ文字コードの変換ができません
LinuxやMacはiconvとか無しでも日本語扱えるようになったのに、Windowsだけなんて・・・orz
HaskellのArrayはpersistentじゃない
0371デフォルトの名無しさん
2011/11/05(土) 20:17:35.880372デフォルトの名無しさん
2011/11/05(土) 20:57:00.85フィルタリングするイメージデータを格納するコンテナには何が適切なの?
0373デフォルトの名無しさん
2011/11/05(土) 21:03:14.210374デフォルトの名無しさん
2011/11/05(土) 21:11:15.45ありがと、調べてみる
0375デフォルトの名無しさん
2011/11/05(土) 21:24:41.490376デフォルトの名無しさん
2011/11/06(日) 01:25:51.610377デフォルトの名無しさん
2011/11/06(日) 02:49:06.58Haskel Reportを読んでもはっきりと書かれていないような。
以下のように関数(>>?)を定義してvalue1, value2を求めると
value1は普通に求められるが、value2は\s -> s + aのところで
aが未定義ですとか言われる。
括弧があると変数の有効範囲が変わるのかな?
(>>?) :: a -> (a -> b) -> b
v >>? f = f v
value1 = (1, 2) >>? \(a, b) -> b >>? \s -> s + a
value2 = (1, 2) >>? (\(a, b) -> b) >>? \s -> s + a
0378デフォルトの名無しさん
2011/11/06(日) 05:53:55.40関数の仮引数の有効範囲はその関数本体というのが基本原則。
> value1 = (1, 2) >>? \(a, b) -> b >>? \s -> s + a
は
value1 = (1, 2) >>? (\(a, b) -> b >>? \s -> s + a)
と解釈されるのでs + aは\(a,b) -> ...の関数本体内に含まれるが
> value2 = (1, 2) >>? (\(a, b) -> b) >>? \s -> s + a
はかっこがあるため含まれない。
0379デフォルトの名無しさん
2011/11/06(日) 13:47:42.37メタルールか。なんとなく理解した。
0380デフォルトの名無しさん
2011/11/06(日) 16:49:56.150381デフォルトの名無しさん
2011/11/06(日) 18:32:21.28そのための$です
意外とLisp化食い止められてない気がするけど…
0382デフォルトの名無しさん
2011/11/06(日) 18:33:01.25少なくとも )))) はだいぶ消えると思うけど。
0383デフォルトの名無しさん
2011/11/06(日) 19:07:40.410384デフォルトの名無しさん
2011/11/06(日) 20:02:50.82逆に言えば、そこにしか効果ないんよ
0385デフォルトの名無しさん
2011/11/06(日) 20:50:27.44HaskellはLispの飼い猫なんだし
0386デフォルトの名無しさん
2011/11/06(日) 20:56:34.75)))) って何これ、ってことだったので、それが緩和されるというのは俺にとっては
大きいw
0387デフォルトの名無しさん
2011/11/06(日) 22:02:11.57飼い猫ちゃう
Haskellは汎用関数型決戦兵器や
Lispは・・・深海型やな
0388デフォルトの名無しさん
2011/11/06(日) 22:02:17.970389デフォルトの名無しさん
2011/11/07(月) 00:04:02.33俺どんな言語で書いても表見ないと安心できない
そのうち面倒くさくなってきてlisp化しちゃう
0390デフォルトの名無しさん
2011/11/07(月) 00:16:22.77算数・数学の結合順序とほとんど同じだろ?
覚えるって程のことかいな。
微妙に分からんところは()で明示すればいいし。
0391デフォルトの名無しさん
2011/11/07(月) 00:29:24.10最初はそんなんだったけど慣れた。
でもちょっと不安な所は、()だらけ。
0392デフォルトの名無しさん
2011/11/07(月) 00:31:14.84あれだけはいつもかっこつけてる。
0393デフォルトの名無しさん
2011/11/07(月) 01:24:33.490394デフォルトの名無しさん
2011/11/07(月) 01:35:26.66そうか?
$使えるところは関数合成できるから、ghciでlet使って試し書きする時は、$使って、ソースに書いてghciでテストする時にソースに$を関数合成に変えたものを書いてる。
(ghci上で直に定義するときは何故か関数合成できない)
0395デフォルトの名無しさん
2011/11/07(月) 06:03:53.93フォーマッタで余計なカッコ外せばいいだろ。
原始時代じゃあるまいし…
0396デフォルトの名無しさん
2011/11/07(月) 07:51:34.75hlintしないの?
0397デフォルトの名無しさん
2011/11/07(月) 08:10:41.16そしたら:iで確かめたらいいし。
0398デフォルトの名無しさん
2011/11/07(月) 10:45:37.92フオーマッタについてもう少しkwskplz
0399デフォルトの名無しさん
2011/11/07(月) 21:04:19.70実効速度違ってくるの?
0400デフォルトの名無しさん
2011/11/07(月) 21:06:43.130401デフォルトの名無しさん
2011/11/07(月) 21:10:41.580402デフォルトの名無しさん
2011/11/07(月) 22:12:23.77ghcに渡すフラグをどこで指定するのかが分からないので教えて欲しい
ぐぐったらinit.elにsetq haskell-ghci-program-args で行けるそうだったけども
どうも反映されない。-Wallを付けたいんだけど…
あと皆さんはどういう環境でHaskell書いてるのかも教えて欲しい
0403デフォルトの名無しさん
2011/11/07(月) 22:31:25.21ただし相当うざいから覚悟すべし
0404デフォルトの名無しさん
2011/11/08(火) 07:19:50.65コンパイルやghciは別にコマンドプロンプトを開いてる(開いておく)
emacsからghcやghciを立ち上げたりはしない
0405デフォルトの名無しさん
2011/11/08(火) 07:55:29.03宗教戦争始めてよ
0406デフォルトの名無しさん
2011/11/08(火) 10:23:13.380407デフォルトの名無しさん
2011/11/08(火) 10:23:23.09所で、haskell版emacsと聞いてYi落としたかったんだが、サーバ落ちてるっぽい
0408デフォルトの名無しさん
2011/11/08(火) 12:02:54.58そもそも領土問題は無い
みたいな
0409デフォルトの名無しさん
2011/11/08(火) 12:09:51.380410デフォルトの名無しさん
2011/11/08(火) 12:15:55.750411デフォルトの名無しさん
2011/11/08(火) 12:36:29.87どちらでも普通に Haskell 使えるし
俺 (>>404) はたまたま Haskell 以外の、普通の文章なんかも書きたかったから、
Windows でプロポーショナルフォントが問題なく使える Emacs を選択した
(vi は固定幅フォントしか使えん)
Haskell コーディングで俺が使う機能としては秀丸でもいいくらいだが、
Emacs の方が個人的には使い心地がいい
0412デフォルトの名無しさん
2011/11/08(火) 12:47:18.45好きなほう選べば良い。
0413301
2011/11/08(火) 13:17:35.69インデントがどうなるのか分からないので使ってない。そんなに数学記号に親しいわけでもないし。
0414デフォルトの名無しさん
2011/11/08(火) 14:09:30.24精精\をλにぐらいだなぁ
0415デフォルトの名無しさん
2011/11/08(火) 17:34:01.70インデントが重要になる場所ではスペース以外使わない習慣を付ければ、
たとえプロポーショナルフォントでも安心してHaskellを書けるよ
0416デフォルトの名無しさん
2011/11/08(火) 18:44:24.02かしこくするようなハックってある?
あと、++ とか && とかでつながった長い行を分けたいとき、
演算子の前で改行する?後で改行?
0417デフォルトの名無しさん
2011/11/08(火) 20:05:54.64とりあえずゲームを作ってみたいので、[The Yampa Arcade] とか
[The University of New South Wales School of Computer Science and Engineering]
なんかの論文や Haskell Wiki を読んだりして試してます
ただ、も少しまとまった情報はないものでしょうか
簡単なものでいいので関数を解説した一覧表なんかあると良いのですが
0418デフォルトの名無しさん
2011/11/08(火) 20:46:15.86AnimasっていうYampaのfork版だともう少しまともなドキュメントになってたけどやっぱりよくわからん
俺はelereaとかreactive-bananaとかの方が遥かに使いやすいと思ったわ
実行効率もいいしな
0419デフォルトの名無しさん
2011/11/08(火) 23:20:26.24ありがとう。ただcabalの設定ファイルだと俺の環境ではうまく行かなかった
それを手がかりに調べて、ホーム\AppData\Roaming\ghc\ghci.confに書いたらうまくいった
-Wall付けたら警告いっぱい出て、パターンマッチが網羅されてないとか役立つのもあったけど
ただ数値のデフォルト化の警告?ってのがよく分からん
警告なんだから良くないコードなんだろうけど
書く環境はやっぱりemacsが多いのか
今まであまり使ってなくて不慣れだけど頑張ってみるよ
0420デフォルトの名無しさん
2011/11/09(水) 08:05:42.63強がろうが俺をバカにしようが
このウンコ言語が大失敗超不人気のLL以下の汚物
だって事実は変わらないの
わかった?負けず嫌いの小学生みたいな負け惜しみ見てると滑稽だよwwww
可哀想になってくるわほんとに
まあお前らも最初は被害者だったんだよな、妄想と大風呂敷に踊らされてよ
でもな、もっと早くに気づいたたゆらはいっぱいいるだろ?
いまでもこんな酔っ払いが吐き戻したゲロみたいな言語を一生懸命庇ってさ
本当の事を指摘している俺がおかしいみたいな感覚になってるんだぞお前ら?www
粋がっちゃったけど結果大失敗でものすごい負け犬感味わってるんだろうから気持ちは解るけどよ
いいかげん現実見つめろや?wwwwな?wwww
実際、今どうなのか言ってみろよ?wwwおい?wwwwww
このゲロみたいなくっせえHaskellっていう言語は使われてるの?
流行ってるの?ヒットしてるの?
発表時みたいな状況になってんのかよ?wwwwwwwww
俺Haskellやってるんだぜ!って人前で言えんのお前ら?wwwwああん?wwwwwwwww
Haskellやってます とかいってやってることはコマンドラインのへなちょこゴミコードwww
0421デフォルトの名無しさん
2011/11/09(水) 08:57:34.07Haskellでプロトタイプ書く人でも最後は結局c++だし・・・
0422デフォルトの名無しさん
2011/11/09(水) 12:41:11.57関数型というパラダイムに酔っ払った人間が自己満足のために腹の中身そのまま捻り出した言語だよなこれ。
大学の自由演習で使ったがただの自己満足コードにしかならない。
0423デフォルトの名無しさん
2011/11/09(水) 12:48:49.57Twitter にでも書いとけ
0424デフォルトの名無しさん
2011/11/09(水) 12:56:40.73なぜ次に使う言語が関数型でまずいのか
http://d.hatena.ne.jp/ymotongpoo/20111105/1320506449
0425デフォルトの名無しさん
2011/11/09(水) 12:58:41.97中の人から批判が一番こたえる
0426デフォルトの名無しさん
2011/11/09(水) 13:02:05.300427デフォルトの名無しさん
2011/11/09(水) 13:24:57.110428デフォルトの名無しさん
2011/11/09(水) 19:31:37.01所詮は烏合の衆だな(w
0429デフォルトの名無しさん
2011/11/09(水) 20:05:25.66(一応、私も含む)
0430デフォルトの名無しさん
2011/11/09(水) 20:13:01.58無視してると言いながら、書いちゃったらダメだよ。次からは何も言わないようにね♪
0431デフォルトの名無しさん
2011/11/09(水) 20:16:28.69と言いつつも書いてるヤシ
0432デフォルトの名無しさん
2011/11/09(水) 20:17:49.21にならないかなってね。
0433デフォルトの名無しさん
2011/11/09(水) 20:28:11.17-Wallは要らないんじゃね?うざいし
型のデフォルト化ってのは
http://www.kotha.net/ghcguide_ja/latest/interactive-evaluation.html
の最後に書いてあるやつ
ただなんでこれで警告対象なのかは分からない、誰か詳しい人居る?
型のデフォルト化は標準で警告出すほどではないけどオススメできないことなんだろうか
0434デフォルトの名無しさん
2011/11/09(水) 20:43:09.66みたいなのを回避したいんじゃね、知らんけど
0435デフォルトの名無しさん
2011/11/09(水) 21:55:59.53(ラベルでなくともアクセス関数を自作しても本質的には同じ事です)
例えばの話でブロック崩しを作ってるとして、
ボールの状態を表すための情報が要りますよね
まぁざっと、位置ベクトル、速度ベクトル、あとはボールの半径を盛り込むとしましょう
data Ball = Ball
{ ballPos :: Vector2
, ballVel :: Vector2
, ballRad :: Double }
私はこうやって、位置を表す Pos や速度を表す Vel などに、接頭辞として
必ずそのデータ型の型構築子(値構築子ではなく)の名前を付けるようにしています
と言うのも、ではボールの他にバーやブロックの情報はどうなるかと言えば、
こちらも位置を表す情報は必要で、他にも重なる部分がいくつか出てきます
同じ pos という関数名を使い回すことが文法上できないので、
上記の方法でやるなら名前の中で何らかの区別をしなければならず、
であるなら変に省略文字で区別するよりは、もうフルネームで区別した方がマシだろ
という判断です
このように、複数のデータ型で同じ意味の情報を扱う場合のラベル名(アクセス関数名)は、
みなさんどうしてるのでしょうか
共通の情報は型クラスに追いやって、インスタンス化してるのでしょうか
その場合は、その関数の引数として対象のデータ型の値が要りますね
0436デフォルトの名無しさん
2011/11/09(水) 22:01:28.320437デフォルトの名無しさん
2011/11/09(水) 22:54:34.310438デフォルトの名無しさん
2011/11/09(水) 22:57:12.57http://www.kotha.net/ghcguide_ja/latest/options-sanity.html に
-fwarn-type-defaults:
数値型に対するデフォルト化機構が発動したときに警告・通知する。
これは、あるデフォルトを前提としたコードを別のデフォルトの下のコードに変換するときに便利である。
例えば、1という値に特に制約がないとき、Haskell 1.4の「デフォルトのデフォルト」は型Intを与えるが、
Haskell 98以降ではこれはIntegerである。
これは実行時性能と挙動に影響を与える可能性があるので、通知されると便利である。
って書いてあるからまさにその通りだと思う
パフォーマンスをカリカリに追求する場合にはこの警告が必要なんだろう
俺はそんなコード書いたこと無いけど
0439デフォルトの名無しさん
2011/11/09(水) 23:04:27.78> その場合は、その関数の引数として対象のデータ型の値が要りますね
これはデータ型に直接ラベルを定義しても同じ事でした、すいません
>>436
やはり、そうしますか
>>437
サブモジュールをどのように作って、どのようにアクセスさせているのでしょうか
モジュールを分けても、データ型のその情報にアクセスする為には関数が必要で、
当然その関数は各モジュールからエクスポートさせるのですよね
ボールの位置、バーの位置、ブロックの位置などの情報に対するアクセス関数の
名前のバッティングはどうしてるのでしょうか
もしかして、各モジュールをインポートする時に as で別名を与えてるのでしょうか
0440デフォルトの名無しさん
2011/11/09(水) 23:15:13.56うん。asで適当に別名付けてる。
0441デフォルトの名無しさん
2011/11/10(木) 17:18:49.29重いIntegerの(^)が呼ばれるのは嫌なことがある(aはDoubleとして)
0442デフォルトの名無しさん
2011/11/10(木) 17:40:52.380443デフォルトの名無しさん
2011/11/10(木) 17:48:18.08役に立ちます
0444デフォルトの名無しさん
2011/11/10(木) 18:08:46.39コードを書いてない段階でどうやって(a^2)の2に型を指定するんだ
0445デフォルトの名無しさん
2011/11/10(木) 18:27:39.40え、どう言う型を受け取って、どう言う型を返したいか、を考えて指定すれば良いだけだよ?
0446デフォルトの名無しさん
2011/11/10(木) 19:47:03.85Yampa 関連のドキュメントは論文も含めてけっこう多いので、
どれがオリジナルなのかもさっぱりなんですが、
どれも個々の特徴を割り下げてたり、活用したり、
さもなければ全体を長々と解説してる感じのものばかり
もっと、全体の構造をスパッと語ってくれると、
それだけでもありがたいのですが、無いですね
reactive も勉強してみたんです
シンクの仕組みがなかなか独特で面白かったんですけど、
結局これは「今はまだ」使えんと思いました
挙動が予測と噛み合わない部分や、予測し難い部分がちょくちょくあるんですよね
例えば integral 関数を使ってると、タイムリークを起こすと言うのかな、
間に合わなかった計算処理がどんどん積み上がっていって次第に処理が遅くなりました
この辺り Yampa なら react 関数を呼ぶ(呼ばれる)タイミングを
そのタイミングの処理の重さに合わせてリアルタイムに調整することは楽にできるんですが、
reactive ではその辺りどうやればいいのかよく分からない
0447デフォルトの名無しさん
2011/11/10(木) 19:53:02.29(^) :: (Num a, Integral b) => a -> b -> a
だから、(a^2)の2の型が何になっても、式全体の型には関わってこない
0448デフォルトの名無しさん
2011/11/10(木) 20:31:23.29こうすりゃいいじゃん
(^(2::Int))
0449デフォルトの名無しさん
2011/11/10(木) 21:08:18.64それ>>442の話と関係なくね?
0450デフォルトの名無しさん
2011/11/10(木) 21:24:40.76自作の関数作るときとかは、型推論に任せるより自分で決めた方が速かったり、逆に遅い代わりに大きな数を扱えたりする
length関数と同じ機能の関数mylength作るとき、
mylength [] = 0
mylength (_:ns) = 1 + mylength ns
の型は[a]->aだが、
mylength::[a]->Int
mylength [] = 0
mylength (_:ns) = 1 + mylength ns
とすれば、当然ながら型は[a]->Intになる
0451デフォルトの名無しさん
2011/11/10(木) 21:26:17.73x [a]->a
o [t]->a
0452デフォルトの名無しさん
2011/11/10(木) 22:01:08.03だからそれは(a^2)のケースでは関係ないよね
0453デフォルトの名無しさん
2011/11/10(木) 22:06:04.65自分で作る関数なら自分で型を決めればいいし、すでにある関数なら、引数に渡す値の方の型を決める他あるまい
0454デフォルトの名無しさん
2011/11/10(木) 22:16:47.46大抵の場合は、自分で作る関数の型さえ決めれば型推論で自動的に全ての型が決まるんだよ
それだけで決まらないこともときどきあって、(^)はそれを発生させる例の筆頭
0455デフォルトの名無しさん
2011/11/10(木) 22:33:42.23そういう話だっけ?
速い型を使いたいけど、型を明示した方が良いのか?って話だった気が・・・
単なる数字(例えば5とか)は、通常Num a。定数として宣言すると、Integralにデフォルトでなるから、数字をInt型にしたいなら、5::Intって具合に宣言しないとダメ
>>441への回答としては(^(2::Int))と書け。が、妥当だと思うんだが・・・
*Main> :t 5
5 :: Num a => a
*Main> let a = 5
*Main> :t a
a :: Integer
*Main> :t 5::Int
5::Int :: Int
0456デフォルトの名無しさん
2011/11/10(木) 22:48:37.04俺は>>442に対する>>443の回答に反論してるだけだよ
■ このスレッドは過去ログ倉庫に格納されています