[過去ログ] 関数型プログラミング言語Haskell Part16 (978レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
449(1): デフォルトの名無しさん [sage] 2011/11/10(木) 21:08:18.64 AAS
>>448448(1): デフォルトの名無しさん [sage] 2011/11/10(木) 20:31:23.29 AAS
>>447
こうすりゃいいじゃん
(^(2::Int))
それ>>442442(3): デフォルトの名無しさん [sage] 2011/11/10(木) 17:40:52.38 AAS
先に型を書くというのはそういうのを防ぐためにも役に立つのかな
の話と関係なくね?
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って具合に宣言しないとダメ
>>441441(2): デフォルトの名無しさん [sage] 2011/11/10(木) 17:18:49.29 AAS
確かに(a^2)と書いただけで(2::Integer)と推論されて
重いIntegerの(^)が呼ばれるのは嫌なことがある(aはDoubleとして)
への回答としては(^(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に対する>>443443(2): デフォルトの名無しさん [sage] 2011/11/10(木) 17:48:18.08 AAS
はい
役に立ちます
の回答に反論してるだけだよ
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))も出してるのに、そこに拘るってのもどうなのよ?
併用すればいいじゃないかって書いたよな?
そこは認めるのか?
462(1): デフォルトの名無しさん [sage] 2011/11/11(金) 00:20:31.17 AAS
もちろん併用は有効。
だけど>>442に>>443の回答は誤り。
463: デフォルトの名無しさん [sage] 2011/11/11(金) 00:32:29.31 AAS
>>462
絡むんじゃなくて、こうだから、間違いって指摘しろよ
時間の無駄
464: デフォルトの名無しさん [sage] 2011/11/11(金) 00:42:49.60 AAS
それこそ
beki n = beki' n 2
465: デフォルトの名無しさん [sage] 2011/11/11(金) 00:47:17.39 AAS
書き損じ・・・
それこそ
beki n = beki' n 2
where
beki'::double->Int->double
beki' n m = n^m
なら、ちゃんとn^2そのものを書く前に2の型も決められるしな
(さすがに、こんな反論もどうかと思うが)
466: デフォルトの名無しさん [sage] 2011/11/11(金) 00:49:18.12 AAS
要するに型を書けば解決する話。
先に書くか後で書くかは無関係ですな。
467(1): デフォルトの名無しさん [sage] 2011/11/11(金) 03:36:49.91 AAS
c言語でのint (*)[4]型っぽいものをhaskell的に表現する場合、
* = Pointer, [] = Array4, int = Intと置き換えて、
Pointer (Array4 Int Int Int Int)とでも書けるんだろうけれど、
int (*)[100]型とかになってくるととても書いていられない。
何か上手い方法はないだろうか。
用途ねーだろって突込みは無しで。
468: デフォルトの名無しさん [sage] 2011/11/11(金) 08:48:39.45 AAS
>>467
コード生成じゃ駄目?
469: デフォルトの名無しさん [sage] 2011/11/11(金) 08:49:33.54 AAS
Data.Arrayってそういうのじゃないの?使ったことないけど。
470: デフォルトの名無しさん [sage] 2011/11/12(土) 01:01:56.40 AAS
reactive-glutを試そうとしたら依存パッケージのcategory-extrasがインストールできなかった。
out of dateなパッケージかどうかすぐに分かる手段ってあるのかな。
471(1): デフォルトの名無しさん [sage] 2011/11/12(土) 08:11:04.13 AAS
ListはもうEducationalモジュールに引っ越せ
472: デフォルトの名無しさん [sage] 2011/11/12(土) 12:18:07.24 AAS
>>471
引っ越したとして、代わりに何を標準ライブラリに入れるの?
今までの List と互換が無ければ今まで作ってきた資産が死ぬし、
さもなければ互換性を捨ててでも入れる大きなメリットがあるものじゃないと
473(5): デフォルトの名無しさん [sage] 2011/11/12(土) 15:32:33.20 AAS
haskellはrubyと比べてダメな言語。 外部リンク:d.hatena.ne.jp
上下前次1-新書関写板覧索設栞歴
あと 505 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.028s