[過去ログ] 関数型プログラミング言語Haskell Part16 (978レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
437(1): デフォルトの名無しさん [sage] 2011/11/09(水) 22:54:34.31 AAS
ぽこぽこサブモジュールを作る。
438: デフォルトの名無しさん [sage] 2011/11/09(水) 22:57:12.57 AAS
>>434434(1): デフォルトの名無しさん [sage] 2011/11/09(水) 20:43:09.66 AAS
知らないうちにInteger使っててパフォーマンスがやばい、
みたいなのを回避したいんじゃね、知らんけど
外部リンク[html]:www.kotha.net に
-fwarn-type-defaults:
数値型に対するデフォルト化機構が発動したときに警告・通知する。
これは、あるデフォルトを前提としたコードを別のデフォルトの下のコードに変換するときに便利である。
例えば、1という値に特に制約がないとき、Haskell 1.4の「デフォルトのデフォルト」は型Intを与えるが、
Haskell 98以降ではこれはIntegerである。
これは実行時性能と挙動に影響を与える可能性があるので、通知されると便利である。
って書いてあるからまさにその通りだと思う
パフォーマンスをカリカリに追求する場合にはこの警告が必要なんだろう
俺はそんなコード書いたこと無いけど
439(1): デフォルトの名無しさん [sage] 2011/11/09(水) 23:04:27.78 AAS
>>435435(1): デフォルトの名無しさん [sage] 2011/11/09(水) 21:55:59.53 AAS
代数データ型のラベルの名前って、みなさんどうしてますか?
(ラベルでなくともアクセス関数を自作しても本質的には同じ事です)
例えばの話でブロック崩しを作ってるとして、
ボールの状態を表すための情報が要りますよね
まぁざっと、位置ベクトル、速度ベクトル、あとはボールの半径を盛り込むとしましょう
data Ball = Ball
{ ballPos :: Vector2
, ballVel :: Vector2
, ballRad :: Double }
私はこうやって、位置を表す Pos や速度を表す Vel などに、接頭辞として
必ずそのデータ型の型構築子(値構築子ではなく)の名前を付けるようにしています
と言うのも、ではボールの他にバーやブロックの情報はどうなるかと言えば、
こちらも位置を表す情報は必要で、他にも重なる部分がいくつか出てきます
同じ pos という関数名を使い回すことが文法上できないので、
上記の方法でやるなら名前の中で何らかの区別をしなければならず、
であるなら変に省略文字で区別するよりは、もうフルネームで区別した方がマシだろ
という判断です
このように、複数のデータ型で同じ意味の情報を扱う場合のラベル名(アクセス関数名)は、
みなさんどうしてるのでしょうか
共通の情報は型クラスに追いやって、インスタンス化してるのでしょうか
その場合は、その関数の引数として対象のデータ型の値が要りますね
> その場合は、その関数の引数として対象のデータ型の値が要りますね
これはデータ型に直接ラベルを定義しても同じ事でした、すいません
>>436436(1): デフォルトの名無しさん [sage] 2011/11/09(水) 22:01:28.32 AAS
俺も型名やその省略形を接頭辞にする
やはり、そうしますか
>>437
サブモジュールをどのように作って、どのようにアクセスさせているのでしょうか
モジュールを分けても、データ型のその情報にアクセスする為には関数が必要で、
当然その関数は各モジュールからエクスポートさせるのですよね
ボールの位置、バーの位置、ブロックの位置などの情報に対するアクセス関数の
名前のバッティングはどうしてるのでしょうか
もしかして、各モジュールをインポートする時に as で別名を与えてるのでしょうか
440: デフォルトの名無しさん [sage] 2011/11/09(水) 23:15:13.56 AAS
>>439
うん。asで適当に別名付けてる。
441(2): デフォルトの名無しさん [sage] 2011/11/10(木) 17:18:49.29 AAS
確かに(a^2)と書いただけで(2::Integer)と推論されて
重いIntegerの(^)が呼ばれるのは嫌なことがある(aはDoubleとして)
442(3): デフォルトの名無しさん [sage] 2011/11/10(木) 17:40:52.38 AAS
先に型を書くというのはそういうのを防ぐためにも役に立つのかな
443(2): デフォルトの名無しさん [sage] 2011/11/10(木) 17:48:18.08 AAS
はい
役に立ちます
444(1): デフォルトの名無しさん [sage] 2011/11/10(木) 18:08:46.39 AAS
いや役に立たんだろ
コードを書いてない段階でどうやって(a^2)の2に型を指定するんだ
445(1): デフォルトの名無しさん [sage] 2011/11/10(木) 18:27:39.40 AAS
>>444
え、どう言う型を受け取って、どう言う型を返したいか、を考えて指定すれば良いだけだよ?
446: デフォルトの名無しさん [sage] 2011/11/10(木) 19:47:03.85 AAS
>>418418(1): デフォルトの名無しさん [sage] 2011/11/08(火) 20:46:15.86 AAS
オリジナルのYampaのドキュメント意味分からんよな
AnimasっていうYampaのfork版だともう少しまともなドキュメントになってたけどやっぱりよくわからん
俺はelereaとかreactive-bananaとかの方が遥かに使いやすいと思ったわ
実行効率もいいしな
Yampa 関連のドキュメントは論文も含めてけっこう多いので、
どれがオリジナルなのかもさっぱりなんですが、
どれも個々の特徴を割り下げてたり、活用したり、
さもなければ全体を長々と解説してる感じのものばかり
もっと、全体の構造をスパッと語ってくれると、
それだけでもありがたいのですが、無いですね
reactive も勉強してみたんです
シンクの仕組みがなかなか独特で面白かったんですけど、
結局これは「今はまだ」使えんと思いました
挙動が予測と噛み合わない部分や、予測し難い部分がちょくちょくあるんですよね
例えば integral 関数を使ってると、タイムリークを起こすと言うのかな、
間に合わなかった計算処理がどんどん積み上がっていって次第に処理が遅くなりました
この辺り Yampa なら react 関数を呼ぶ(呼ばれる)タイミングを
そのタイミングの処理の重さに合わせてリアルタイムに調整することは楽にできるんですが、
reactive ではその辺りどうやればいいのかよく分からない
447(1): デフォルトの名無しさん [sage] 2011/11/10(木) 19:53:02.29 AAS
>>445
(^) :: (Num a, Integral b) => a -> b -> a
だから、(a^2)の2の型が何になっても、式全体の型には関わってこない
448(1): デフォルトの名無しさん [sage] 2011/11/10(木) 20:31:23.29 AAS
>>447
こうすりゃいいじゃん
(^(2::Int))
449(1): デフォルトの名無しさん [sage] 2011/11/10(木) 21:08:18.64 AAS
>>448
それ>>442の話と関係なくね?
450(2): デフォルトの名無しさん [sage] 2011/11/10(木) 21:24:40.76 AAS
>>449
自作の関数作るときとかは、型推論に任せるより自分で決めた方が速かったり、逆に遅い代わりに大きな数を扱えたりする
length関数と同じ機能の関数mylength作るとき、
mylength [] = 0
mylength (_:ns) = 1 + mylength ns
の型は[a]->aだが、
mylength::[a]->Int
mylength [] = 0
mylength (_:ns) = 1 + mylength ns
とすれば、当然ながら型は[a]->Intになる
451: デフォルトの名無しさん [sage] 2011/11/10(木) 21:26:17.73 AAS
訂正
x [a]->a
o [t]->a
452(1): デフォルトの名無しさん [sage] 2011/11/10(木) 22:01:08.03 AAS
>>450
だからそれは(a^2)のケースでは関係ないよね
453(1): デフォルトの名無しさん [sage] 2011/11/10(木) 22:06:04.65 AAS
>>452
自分で作る関数なら自分で型を決めればいいし、すでにある関数なら、引数に渡す値の方の型を決める他あるまい
454(1): デフォルトの名無しさん [sage] 2011/11/10(木) 22:16:47.46 AAS
>>453
大抵の場合は、自分で作る関数の型さえ決めれば型推論で自動的に全ての型が決まるんだよ
それだけで決まらないこともときどきあって、(^)はそれを発生させる例の筆頭
455: デフォルトの名無しさん [sage] 2011/11/10(木) 22:33:42.23 AAS
>>454
そういう話だっけ?
速い型を使いたいけど、型を明示した方が良いのか?って話だった気が・・・
単なる数字(例えば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
456(1): デフォルトの名無しさん [sage] 2011/11/10(木) 22:48:37.04 AAS
>>441は何も質問してないのに回答とかよくわからん
俺は>>442に対する>>443の回答に反論してるだけだよ
457: デフォルトの名無しさん [sage] 2011/11/10(木) 23:17:35.61 AAS
>>456
ん、んんん?
だったら、>>450の通り、先に型を書けば防げてるだろ?
(^(2::Int))は併用すればいい話じゃね?
ごちゃ混ぜに話すなよ
458(1): デフォルトの名無しさん [sage] 2011/11/10(木) 23:20:16.10 AAS
何が防げてるの?
459: デフォルトの名無しさん [sage] 2011/11/10(木) 23:32:16.57 AAS
>>458
遅いIntegerやNum aを使うのを防げてるだろ
だあ、もう
beki1 a = a ^ 2
beki2 :: Int -> Int
beki2 a = a ^ 2
beki3::Int -> Int
beki3 a = a ^ 2::Int
下に行くほど、遅い型を使うの防げてる
以上
460(1): デフォルトの名無しさん [sage] 2011/11/10(木) 23:40:30.36 AAS
先に書くだけじゃ、2がIntegerになるのは防げないんでしょ?
461: デフォルトの名無しさん [sage] 2011/11/10(木) 23:54:39.66 AAS
>>460
そうだな
ただ、一般的には自分で型を書いた方が速い型を選べる
(^(2::Int))も出してるのに、そこに拘るってのもどうなのよ?
併用すればいいじゃないかって書いたよな?
そこは認めるのか?
上下前次1-新書関写板覧索設栞歴
あと 517 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.022s