関数型プログラミング言語Haskell Part17
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん
2012/01/02(月) 22:19:28.26ttp://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/
Part16 ttp://toro.2ch.net/test/read.cgi/tech/1317958045/
0940デフォルトの名無しさん
2012/03/12(月) 15:16:01.870941デフォルトの名無しさん
2012/03/12(月) 15:31:07.390942デフォルトの名無しさん
2012/03/12(月) 17:15:41.64http://toro.2ch.net/test/read.cgi/gamedev/1331217117
ここの無様なクソゲーしか作れないかわいそうなやつらをなじってください
私が「クソゲーしか作れないのか?!!!」と強烈批判すると
クズ「そのクソゲーすら作れないお前が文句いうな」
とかいってきます
どうしましょう?
私はゲーム開発者ではありません ゲームファンです
やはり彼らは、隠しているのではなく
公に自分のゲームを見せつけています
それを評価しているだけなのに「文句言われます」
それって意味わかりませんよね?
文句言われるなら見せるな作るなって事です
なんとかいってやってください
インテリゲンチャなHaskellハッカーさんたち
やはり
0943デフォルトの名無しさん
2012/03/12(月) 18:40:09.870944デフォルトの名無しさん
2012/03/12(月) 19:41:09.23こいつらの受け答えはむかつかない
凄いいいやつだらけだなここのスレは
じゃあな
また今度会おうぜ
0945デフォルトの名無しさん
2012/03/12(月) 20:07:35.020946デフォルトの名無しさん
2012/03/12(月) 20:36:58.76| V2 Int Double String
| V3 String Int Int Int Int Int Int
なんていう型を要素として持つリストがあってさ、
そのリストの中から V3 の値構築子で作ったものだけが欲しい場合、
f :: [T] -> [T]
f = filter g
この関数 g は
g (V3 _ _ _ _ _ _ _) = True
g _ = False
とか case of を使って作る事になるが、アンダーバーが鬱陶しい
同じ(qualified な)名前の値構築子で引数の数(や型)が異なるものなんて無いのだから、
V3 にマッチするかどうか調べるのにアンダーバーすら書きたくないのが本音
でも現状、こうやってアンダーバーを書き連ねるしか方法は無いんだよね
0947デフォルトの名無しさん
2012/03/12(月) 20:48:58.310948デフォルトの名無しさん
2012/03/12(月) 21:06:32.92レコード構文ってパターンマッチにも使えるのか
すげー 感動したぜ
ありがと
0949デフォルトの名無しさん
2012/03/12(月) 21:54:32.91data SomeObject = SomeObject ObjectType String
SomeObject H "Hoge..."
SomeObject F "Foo..."
みたいに使うならそもそも
data SomeObject =
H String |
F String |
B String
みたいに宣言した方が良いの?
但し全てStringを使うものとする
0950デフォルトの名無しさん
2012/03/12(月) 22:29:44.24俺(>>946)に対するレス?
俺はデータ型の合理的な運用という高レベルじゃなく、
単にパターンマッチの記述で楽したいという低レベルの質問をしただけだよ
むちゃくちゃ適当に書いた例が悪かったか?
0951デフォルトの名無しさん
2012/03/12(月) 23:12:27.45いや全員に訊いた
0952デフォルトの名無しさん
2012/03/12(月) 23:45:01.41上のタイプの宣言なら
getString (SomeObject _ str) = str
みたいに、ObjectTypeに関わらず文字列を取得するような関数が容易に書ける。
下は全部のパターン網羅しないと無理。
微々たる違いとしては、内部的にはSomeObjectのコンストラクタ情報分サイズ増える。
(ObjectType, String)をnewtypeでラップしてやれば解決だけど。
違いはこんなとこじゃね?
目的に沿ったものを好きに選択しる
0953952
2012/03/13(火) 00:02:44.09微々たる違い〜云々のとこは忘れてくれ…。
0954デフォルトの名無しさん
2012/03/13(火) 00:07:48.75ここに書くと空白文字使えないんで見難くなる
(かといって、全角空白いれるとコピペして即実行はできんし)
どこか、コード片をアップできるところ無い?
0955はちみつ餃子 ◆8X2XSCHEME
2012/03/13(火) 00:11:55.850956デフォルトの名無しさん
2012/03/13(火) 00:13:09.670957デフォルトの名無しさん
2012/03/13(火) 00:14:57.80upするならhpaste, codepad, pastebinとかいろいろあるよ
0958デフォルトの名無しさん
2012/03/13(火) 00:37:30.07(.) の二項演算版がonなんだな!
ならリファレンスに一言そう書きゃいいのに
0959デフォルトの名無しさん
2012/03/13(火) 00:37:31.14じゃなくて &で空白を置換すればいいの?
0960デフォルトの名無しさん
2012/03/13(火) 00:42:10.98ああボケてた。 だ
ごめんごめん
0961デフォルトの名無しさん
2012/03/13(火) 00:46:04.69$(isComeFrom 値構築子) とすると、次のコードが生成される
\x -> case x of 値構築子 -> True; otherwise -> False
値構築子の引数の数も自動的に考慮される
[使用例] filter $(isComeFrom V1) [V2, V1, V3, V1, V6, V1]
{-# LANGUAGE TemplateHaskell #-}
module PatternMatch where
import Language.Haskell.TH
isComeFrom :: Name -> ExpQ
isComeFrom vc = do
i <- reify vc
case i of
DataConI _ t _ _ -> [| \x -> $(caseE [|x|] (alts $ dcArgCnt t)) |]
otherwise -> error "The argument of $(isComeFrom) \
\template must be a data constructor."
where alts n =
[ match (conP vc (replicate n wildP)) (normalB [|True|]) []
, match wildP (normalB [|False|]) []
]
dcArgCnt :: Type -> Int
dcArgCnt (AppT _ t) = 1 + dcArgCnt t
dcArgCnt _ = 0
0962961
2012/03/13(火) 00:51:04.94実は俺 >>946 なんだが、
パターンマッチ書くのも、otherwise 書くのも面倒になってきたから、
テンプレート作って自動化させた
これ、俺の中では結構需要あって、ただいま絶賛大ヒット中
ただ、テンプレートの関数名がダサいし長いんだが、良い案が思いつかん
ところで、やっぱ個人的にはプロポーショナルなフォントだと見難いな
0963961
2012/03/13(火) 00:58:35.61すまん、使用例でアポストロフィを書き忘れてた
ついでだから、もう少し詳細な使用例
data T = V1 Int Int Int
| V2 Int Double String
| V3 String Int Int Int Int Int Int
t1 = V1 0 0 0
t2 = V2 0 0 "a"
t3 = V3 "a" 0 0 0 0 0 0
filter $(isComeFrom 'V3) [t1, t2, t3, t2, t3, t1]
計算結果
[t3, t3]
0964デフォルトの名無しさん
2012/03/13(火) 20:49:01.02template HaskellでV3という名前からtoConstr $ V3 undefined undefined undefined ...という式を作るテンプレートを書き(これをtoConstr'とする)
filter (\x -> $(toConstr' 'V3) == toConstr x) [t1..]
という手を考えたけどただの濫用だわな
0965デフォルトの名無しさん
2012/03/13(火) 21:09:34.14邪悪な発想か
それが問題だ
正しい思考パラダイムにはパラダイス
邪悪な思考パラダイムにはパラライズ
水が高いところから低い所へ流れるように
道理の設計を
0966デフォルトの名無しさん
2012/03/14(水) 02:10:43.380967デフォルトの名無しさん
2012/03/14(水) 07:09:39.37何を言ってるの?
0968デフォルトの名無しさん
2012/03/14(水) 08:25:31.430969デフォルトの名無しさん
2012/03/14(水) 08:41:51.02instance Showの度に挿むべき?
それともmainで最後の出力に一括のみすべき?
前者はUTF-8以外のコンソールでのインタプリタで開発する時に便利だけど
なんか違う気がする
後者は正式な感じだけど、開発時に不便
0970デフォルトの名無しさん
2012/03/14(水) 10:33:10.69入出力の前後で変換しないとダメなんじゃないか?
Haskell内じゃUnicodeとLatin1以外ろくに使えないし
0971デフォルトの名無しさん
2012/03/14(水) 10:59:29.93最初のテストがなまじIOで正しく表示されたもんで勘違いしてました
0972デフォルトの名無しさん
2012/03/14(水) 11:45:55.16文字列リテラルに日本語文字を使用したデータが正しく構築されてるか
インタプリタで覗く用途としてのSJIS変換版showはSJISコンソール上のGHCiで機能します
showの実装の方針は、
@Read型クラスのインスタンスでもある場合は
showとreadが逆関数の関係になるように、
ARead型クラスのインスタンスでない場合は
ヒューマンリーダブルに
であってますか?
0973デフォルトの名無しさん
2012/03/14(水) 12:25:34.60でもChar型のエンコードはule4って規定があるわけよ。
Windowsではたまたま表示だけうまくいくかもしんないけど、
ロケールとか考慮して入出力で変換してくれる他の環境じゃ化けるだろうし、
そもそも、そのshowで生成した文字列は表示以外でボロクソになるんじゃないか?
それってshowの機能としてどうなのよ。
0974デフォルトの名無しさん
2012/03/14(水) 12:27:53.670975デフォルトの名無しさん
2012/03/14(水) 17:37:24.31http://shootout.alioth.debian.org/u64q/performance.php?test=threadring
0976デフォルトの名無しさん
2012/03/14(水) 17:50:32.01だいぶ違ってくるって話がなかったっけ?
0977デフォルトの名無しさん
2012/03/14(水) 18:16:01.710978デフォルトの名無しさん
2012/03/14(水) 18:20:43.67Erlangのはプロセスだから直接比較しても意味ねえだろw
0979デフォルトの名無しさん
2012/03/14(水) 19:17:31.520980デフォルトの名無しさん
2012/03/14(水) 19:26:12.43メッセージによってのみ結合されているのだから
スレッドと直接比較しても意味ねえよw
0981デフォルトの名無しさん
2012/03/14(水) 21:20:06.200982デフォルトの名無しさん
2012/03/14(水) 22:18:19.460983デフォルトの名無しさん
2012/03/15(木) 05:00:15.45@
foldl
foldl'
どちらでもかかりますか?
サンクを忘却していくfoldl'の方だけですか?
Aインタプリタでもかかりますか?
0984デフォルトの名無しさん
2012/03/15(木) 07:20:31.53「かかる」というのが最終的にどういう状態になるのを期待しているのか不明だが
ライブラリドキュメントで foldl や foldl' のソースを見れば分かるが、
どちらも関数全体の評価の最後に自分自身を評価しているから末尾再帰だ
そして、末尾再帰の形になっているものは、
コンパイルしてもインタープリタでも同じように評価される
もちろん hugs を使ってもだ
0985デフォルトの名無しさん
2012/03/15(木) 07:45:54.17寧ろ、そのチューニングに興味あるな。
0986デフォルトの名無しさん
2012/03/15(木) 08:40:45.02遅延の末尾再帰ってサンク残しますよね
正格な末尾再帰なら手続き型言語のforループのように
一定空間で走る事はすんなり想像できます
しかし遅延でサンク残すバージョンだと
どう最適化するのでしょう?
サンクのせいで空間が膨れ上がり続けますよね
どうもイメージ湧かないのです
0987デフォルトの名無しさん
2012/03/15(木) 09:59:57.14非正格なfoldlでサンクが膨れ上がるのを何とかするのは末尾再帰最適化とは関係なくて、
それを勝手に正格に最適化されても困るから正格動作するfoldl'が用意されてるんだろ。
0988デフォルトの名無しさん
2012/03/15(木) 10:19:21.580989デフォルトの名無しさん
2012/03/15(木) 10:37:19.930990デフォルトの名無しさん
2012/03/15(木) 10:40:26.18レス数が950を超えています。1000を超えると書き込みができなくなります。