トップページtech
990コメント380KB

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

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん2012/01/02(月) 22:19:28.26
haskell.org
ttp://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.87
他人のふんどしで相撲を取る。これが俺の生き様
0941デフォルトの名無しさん2012/03/12(月) 15:31:07.39
いつもながら自然言語処理で扱いやすい文体でとてもよろしい
0942デフォルトの名無しさん2012/03/12(月) 17:15:41.64
【3Dゲームエンジン】Unity 10
http://toro.2ch.net/test/read.cgi/gamedev/1331217117

ここの無様なクソゲーしか作れないかわいそうなやつらをなじってください

私が「クソゲーしか作れないのか?!!!」と強烈批判すると

クズ「そのクソゲーすら作れないお前が文句いうな」

とかいってきます

どうしましょう?

私はゲーム開発者ではありません ゲームファンです

やはり彼らは、隠しているのではなく
公に自分のゲームを見せつけています
それを評価しているだけなのに「文句言われます」
それって意味わかりませんよね?

文句言われるなら見せるな作るなって事です

なんとかいってやってください
インテリゲンチャなHaskellハッカーさんたち

やはり
0943デフォルトの名無しさん2012/03/12(月) 18:40:09.87
↑この人、前はもう少し日本語がまともだったような気がするんだが
0944デフォルトの名無しさん2012/03/12(月) 19:41:09.23
俺はここのスレのやつが一番いいと思ってる
こいつらの受け答えはむかつかない

凄いいいやつだらけだなここのスレは

じゃあな
また今度会おうぜ
0945デフォルトの名無しさん2012/03/12(月) 20:07:35.02
ええ、お待ちしております
0946デフォルトの名無しさん2012/03/12(月) 20:36:58.76
data T = V1 Int Int Int
   | 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.31
レコード構文を使いなされ…
0948デフォルトの名無しさん2012/03/12(月) 21:06:32.92
>>947
レコード構文ってパターンマッチにも使えるのか

すげー 感動したぜ
ありがと
0949デフォルトの名無しさん2012/03/12(月) 21:54:32.91
data ObjectType = H | F | B

data 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
>>949
俺(>>946)に対するレス?

俺はデータ型の合理的な運用という高レベルじゃなく、
単にパターンマッチの記述で楽したいという低レベルの質問をしただけだよ

むちゃくちゃ適当に書いた例が悪かったか?
0951デフォルトの名無しさん2012/03/12(月) 23:12:27.45
>>950
いや全員に訊いた
0952デフォルトの名無しさん2012/03/12(月) 23:45:01.41
>>949
上のタイプの宣言なら
getString (SomeObject _ str) = str
みたいに、ObjectTypeに関わらず文字列を取得するような関数が容易に書ける。
下は全部のパターン網羅しないと無理。

微々たる違いとしては、内部的にはSomeObjectのコンストラクタ情報分サイズ増える。
(ObjectType, String)をnewtypeでラップしてやれば解決だけど。

違いはこんなとこじゃね?
目的に沿ったものを好きに選択しる
09539522012/03/13(火) 00:02:44.09
わるい、よく考えたらサイズかわんねーな。
微々たる違い〜云々のとこは忘れてくれ…。
0954デフォルトの名無しさん2012/03/13(火) 00:07:48.75
Template Haskell で20行未満の面白いテンプレートを作ったんで見てほしいんだが、
ここに書くと空白文字使えないんで見難くなる
(かといって、全角空白いれるとコピペして即実行はできんし)

どこか、コード片をアップできるところ無い?
0955はちみつ餃子 ◆8X2XSCHEME 2012/03/13(火) 00:11:55.85
ブレース記法
0956デフォルトの名無しさん2012/03/13(火) 00:13:09.67
使ったことないけどGistとか
0957デフォルトの名無しさん2012/03/13(火) 00:14:57.80
&で空白を置換するか
upするなら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
>>959
ああボケてた。 だ
ごめんごめん
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
09629612012/03/13(火) 00:51:04.94
>>961

実は俺 >>946 なんだが、
パターンマッチ書くのも、otherwise 書くのも面倒になってきたから、
テンプレート作って自動化させた

これ、俺の中では結構需要あって、ただいま絶賛大ヒット中

ただ、テンプレートの関数名がダサいし長いんだが、良い案が思いつかん


ところで、やっぱ個人的にはプロポーショナルなフォントだと見難いな
09639612012/03/13(火) 00:58:35.61
>>961
すまん、使用例でアポストロフィを書き忘れてた
ついでだから、もう少し詳細な使用例

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.02
Data,TypeableをTの定義でderivingして
template 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.38
低きにながれるのは当たり前だろ
0967デフォルトの名無しさん2012/03/14(水) 07:09:39.37
>>966
何を言ってるの?
0968デフォルトの名無しさん2012/03/14(水) 08:25:31.43
地球には重力があると言ってるんだろう
0969デフォルトの名無しさん2012/03/14(水) 08:41:51.02
iconvによるエンコーディング変換って
instance Showの度に挿むべき?

それともmainで最後の出力に一括のみすべき?


前者はUTF-8以外のコンソールでのインタプリタで開発する時に便利だけど
なんか違う気がする

後者は正式な感じだけど、開発時に不便
0970デフォルトの名無しさん2012/03/14(水) 10:33:10.69
showで変換したいってのがよくわからんが…
入出力の前後で変換しないとダメなんじゃないか?
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
いや、showで変換するってことはString = [Char]だけど中身はSJISとかになってるってことでしょ?
でもChar型のエンコードはule4って規定があるわけよ。
Windowsではたまたま表示だけうまくいくかもしんないけど、
ロケールとか考慮して入出力で変換してくれる他の環境じゃ化けるだろうし、
そもそも、そのshowで生成した文字列は表示以外でボロクソになるんじゃないか?
それってshowの機能としてどうなのよ。
0974デフォルトの名無しさん2012/03/14(水) 12:27:53.67
すまん、ucs4の間違い。ule4ってなんだ…
0975デフォルトの名無しさん2012/03/14(水) 17:37:24.31
どうやらHaskellのスレッドはCやErlangを超えて最速みたいだな
http://shootout.alioth.debian.org/u64q/performance.php?test=threadring
0976デフォルトの名無しさん2012/03/14(水) 17:50:32.01
shootoutは、その言語の達人ががんばってめちゃくちゃチューニングしてるかどうかで
だいぶ違ってくるって話がなかったっけ?
0977デフォルトの名無しさん2012/03/14(水) 18:16:01.71
ここだけ、いつも新着レスがある感じだもんね。でもそんなに使われている印象は受けないけど、興味をそれだけ惹き付けるということなのか。
0978デフォルトの名無しさん2012/03/14(水) 18:20:43.67
>>975
Erlangのはプロセスだから直接比較しても意味ねえだろw
0979デフォルトの名無しさん2012/03/14(水) 19:17:31.52
Erlangでプロセスと呼ぶものはユーザスレッドね。
0980デフォルトの名無しさん2012/03/14(水) 19:26:12.43
ユーザスレッドによって実装されているというだけで、
メッセージによってのみ結合されているのだから
スレッドと直接比較しても意味ねえよw
0981デフォルトの名無しさん2012/03/14(水) 21:20:06.20
すてま
0982デフォルトの名無しさん2012/03/14(水) 22:18:19.46
まてす
0983デフォルトの名無しさん2012/03/15(木) 05:00:15.45
末尾再帰最適化って
@
foldl
foldl'
どちらでもかかりますか?

サンクを忘却していくfoldl'の方だけですか?


Aインタプリタでもかかりますか?
0984デフォルトの名無しさん2012/03/15(木) 07:20:31.53
>>983
「かかる」というのが最終的にどういう状態になるのを期待しているのか不明だが

ライブラリドキュメントで foldl や foldl' のソースを見れば分かるが、
どちらも関数全体の評価の最後に自分自身を評価しているから末尾再帰だ

そして、末尾再帰の形になっているものは、
コンパイルしてもインタープリタでも同じように評価される
もちろん hugs を使ってもだ
0985デフォルトの名無しさん2012/03/15(木) 07:45:54.17
>>976
寧ろ、そのチューニングに興味あるな。
0986デフォルトの名無しさん2012/03/15(木) 08:40:45.02
>>984
遅延の末尾再帰ってサンク残しますよね

正格な末尾再帰なら手続き型言語のforループのように
一定空間で走る事はすんなり想像できます
しかし遅延でサンク残すバージョンだと
どう最適化するのでしょう?
サンクのせいで空間が膨れ上がり続けますよね
どうもイメージ湧かないのです
0987デフォルトの名無しさん2012/03/15(木) 09:59:57.14
foldlもfoldl'も呼び出し元に戻らないって意味で末尾再帰最適化はするんじゃないの?
非正格なfoldlでサンクが膨れ上がるのを何とかするのは末尾再帰最適化とは関係なくて、
それを勝手に正格に最適化されても困るから正格動作するfoldl'が用意されてるんだろ。
0988デフォルトの名無しさん2012/03/15(木) 10:19:21.58
末尾再帰最適化はスタック膨れ上がるのを阻止するだけですか
0989デフォルトの名無しさん2012/03/15(木) 10:37:19.93
そうです。
0990デフォルトの名無しさん2012/03/15(木) 10:40:26.18
ありがとうございました
レス数が950を超えています。1000を超えると書き込みができなくなります。