関数型プログラミング言語Haskell Part17
■ このスレッドは過去ログ倉庫に格納されています
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/
0685デフォルトの名無しさん
2012/02/19(日) 01:50:54.96ParsecでCSVファイルの解析をためしたら文字化けしてたから、idとかに変えていろいろ試してました
これ結局、Parsecを間に入れてファイル入出力する場合は文字コードの変換を明示しないとダメということなんですね
0686682
2012/02/19(日) 02:13:53.28そう
Parsec で日本語を処理したいのなら、処理前に UTF-8 にエンコードしないとダメ
参考になりそうなページ
http://snak.tdiary.net/20110104.html
0687デフォルトの名無しさん
2012/02/19(日) 09:55:24.280688デフォルトの名無しさん
2012/02/19(日) 15:43:45.810689デフォルトの名無しさん
2012/02/19(日) 15:51:43.820690デフォルトの名無しさん
2012/02/19(日) 15:58:31.270691デフォルトの名無しさん
2012/02/19(日) 15:58:44.910692デフォルトの名無しさん
2012/02/19(日) 16:00:51.900693デフォルトの名無しさん
2012/02/19(日) 21:52:36.96(一応なるべく簡略化したので、このコード自体に深い意味はないです)
combination n r =div (product [1..n]) (product [1..r] * product [1..n-r])
f n = length (takeWhile (<=4000) (map (combination n) [1..5] ))
hoge = [n - f n | n<-[20]]
私はこの hoge を [20 - f 20] のつもりで書きました。GHCで [20 - f 20] と入力すると 17 と返ってくるので、 hoge は [17] になっていてほしいです。
なのに、なぜか hoge と入力すると [15] が返ってきます。どなたかどこが誤っているのかわかる方がいらっしゃったら教えていただけないでしょうか。
0694デフォルトの名無しさん
2012/02/19(日) 22:36:50.85product [1..20]がオーバーフローしている。
ghciで [20 - f 20] としたときはたぶんf 20の20がIntegerとして評価されているからオーバーフローが生じていない。
ghciで[20 - f (20 :: Integer)]と[20 - f (20::Int)]を比較して、考えれば、言っていることが分かるだろう。
0695デフォルトの名無しさん
2012/02/19(日) 22:39:24.02原因は >>694 の通り
解決方法の一つは、f 関数内で length 関数の代わりに genericLength 関数を使う
0696694
2012/02/19(日) 22:43:26.210697695
2012/02/19(日) 22:43:45.05その >>693 の(型シグネチャを省いた)例なら、
genericLength 関数を使えば自動的に全て解決するという意味
実際のコードで型シグネチャを書いてる場合、
例えば combination 関数の型が Int -> Int なら、
それも Integer に直す必要がある
0698694
2012/02/19(日) 22:44:07.360699デフォルトの名無しさん
2012/02/19(日) 22:54:59.050700デフォルトの名無しさん
2012/02/19(日) 22:58:28.0820と20が同じ型である必要はないってことだね
「lengthがIntegral a => a型ではなくInt型を返すのはまったく馬鹿げたこと」
だっけか
0701デフォルトの名無しさん
2012/02/19(日) 23:21:56.89それは無い
ただ、オーバーフローしたのならしたと分かるような、
デバッグ用の RTS オプションとかあるといいな
0702693
2012/02/19(日) 23:52:01.42なるほど、そういうことでしたか。型宣言は省略していたので、おっしゃる通り genericLength という関数を(初めて見ました)使うことで解決しました。
質問前にコードを書き換えて実験していたとき、 hoge = [f n | n<-[20]] とするとちゃんと [f 20] に一致するのが不思議だったのですが、それも >>700 を読んで合点がいきました。
単に f n と書くと Integer 型として扱われるが、n - f n と書いた場合には n が Int 型になってしまっていたのですね。それでオーバーフローしたと。
自分では絶対に気づきませんでした…。お三方(お二方?)ご親切にありがとうございます。
0703デフォルトの名無しさん
2012/02/20(月) 12:44:31.59その問題は直ったって言ったじゃないですかー!
0704デフォルトの名無しさん
2012/02/22(水) 01:04:11.990705デフォルトの名無しさん
2012/02/22(水) 18:49:36.88Haskellに限らず、gtk全般がwindowsと相性が悪いと思うのは私だけでしょうか?
0706デフォルトの名無しさん
2012/02/22(水) 19:12:47.80今は wxpack もあって、Haskell で使うのも、
特別なことをしなければ gtk2hs 並に簡単になった
0707デフォルトの名無しさん
2012/02/22(水) 19:21:08.180708デフォルトの名無しさん
2012/02/22(水) 19:31:59.91一月に新しいの出てんのね
ちょっと移るか・・・
0709デフォルトの名無しさん
2012/02/23(木) 21:38:20.07重複もある要素群から組合せや順列作りたい時どうするの?
0710デフォルトの名無しさん
2012/02/24(金) 00:08:55.34二つの別のモジュールで同名の関数定義してたらmoduleName.は略せない
0711はちみつ餃子 ◆8X2XSCHEME
2012/02/24(金) 00:48:25.04実際に使ってない関数で衝突があってもどうでもいいじゃん。
0712デフォルトの名無しさん
2012/02/24(金) 03:21:55.39それぞれのモジュールをインポートするときに
インポートする関数名を明示的に指定するんじゃだめなのかね?
0713デフォルトの名無しさん
2012/02/24(金) 07:30:30.90指摘している問題箇所がよく分からない
こちらの環境(GHC 7.4.1)で試したら、全く問題なかったんだが
-----[ Mod1.hs ]-----
module Mod1 (t1, t2) where
t1 = (*3)
t2 = (+7)
-----[ Mod2.hs ]-----
module Mod2 (t1, t3) where
t1 = (*5)
t3 = (+13)
-----[ ModC.hs ]-----
module ModC where
import Mod1
import Mod2
f = t2
g = t3
ghci でエラーも無く ModC をロードできる
当然、関数 f や g は普通に使える
また、ghc で実行ファイルやライブラリにコンパイルする事もできる
ModC で関数 t1 を使おうとすると Ambiguous occurrence エラーが出る
その場合はモジュールを明示するか、import でエイリアス名を指定すれば良い
何が問題なんだ?
0714デフォルトの名無しさん
2012/02/25(土) 17:50:44.36*.cabal ファイルに例えば以下のような記述があった場合
flag ichigo
default: False
if flag(ichigo)
---[ A ]---
else
---[ B ]---
configure に [A] が通るのか [B] が通るのか、どちらなのでしょうか
0715デフォルトの名無しさん
2012/02/26(日) 18:39:03.77型の決め打ちを段階的に遅延してもらうものだと思えばいいの?
0716デフォルトの名無しさん
2012/02/27(月) 07:24:50.28どうしてそう思う?
(違うと言ってるんじゃなくて、単純にその考え方に興味があるだけです)
0717デフォルトの名無しさん
2012/02/27(月) 08:03:50.64(\f -> (f 1,f "1")) id
No instance for (Num [Char])
arising from the literal `1' at <interactive>
Possible fix: add an instance declaration for (Num [Char])
In the first argument of `f', namely `1'
In the expression: f 1
In the expression: (f 1, f "1")
これがエラーになるのは
コンパイル時に最初に評価したほうの型で固定しちゃうからでしょう?
最初に解釈した段階でid 1だから
id::Int -> Int
で固定しちゃう
次にid "1" をみてなんだこりゃ?
id:: String -> Stringなんて聞いたこと無いぞ!とコンパイラが怒り出す
この悲劇を回避するために
決め打ちは一段階待ってくれ
a -> a のまま進んでくれ
ってのがforallとXRank2Typesオプションのセットの役目なんじゃないの?
評価の遅延じゃん?
実行の遅延評価じゃなくてコンパイル時の型の遅延評価だから
メタ遅延評価的な
0718デフォルトの名無しさん
2012/02/27(月) 12:45:29.31値を遅延評価できても、型も遅延評価できるとは限らないんだな。
0719デフォルトの名無しさん
2012/02/27(月) 13:20:52.44静的に型付けて片付ける型の言語だし
そのくらい大目に見てやれよ
どっちから型を付けても(エラーメッセージ以外は)同じ結果になる
0721デフォルトの名無しさん
2012/02/27(月) 21:39:35.38http://en.wikibooks.org/wiki/Haskell/Existentially_quantified_types
このページで分からない部分がある
[Explaining the term existential] のセンテンスの
「But we got almost the same behaviour above using datatypes. Let's declare one.」
の直前まではなんとか分かった
forall = 積集合
exists = 和集合(Haskell の構文には無い)
というのも、納得はできないが、とりあえずそういうものだと見なす事にする
で、そのすぐ下の「MkT :: forall a. a -> T」 の意味を説明している部分がよく分からない
これまでの話の流れからすると、forall a. (a -> T) というのが、
どういう型(を意味する集合)の積集合になるかを考えれば良いんだよな
つまり、
Int -> T という型を意味する集合が持つ要素
String -> T という型を意味する集合が持つ要素
・・・
などに共通する要素だけを持つ型が forall a. a -> T なんだよな
ここまでは合ってる?
で、その共通する要素って、ボトム以外に具体的にどういうものがあるのかな
と考えてみると・・・ よく分からない
「何かを入力して型 T の値を得る関数」というのがそれかなと初め思ったけど、
じゃあこれは例えば「Int -> T という型を意味する集合が持つ要素」に含まれているのか
と考えると、なんか違う気がする
0722デフォルトの名無しさん
2012/02/27(月) 23:11:20.23(\f -> (f 1, f "1")) id
積集合
(\(f,f') -> (f 1, f' "1")) (id,id)
和集合
id' (Left x) = Left (id x)
id' (Right x) = Right (id x)
(\f -> (f (Left 1), f (Right "1"))) id'
集合が有限なら、forallとexistsは不要です。
0723デフォルトの名無しさん
2012/02/27(月) 23:52:14.920724デフォルトの名無しさん
2012/02/28(火) 00:04:14.040725デフォルトの名無しさん
2012/02/28(火) 03:02:25.61俺は共通する要素とか集合って考えるより、
特定の型に依存しない性質を含んだ関数って考えた方がピンとくるな。
>で、その共通する要素って、ボトム以外に具体的にどういうものがあるのかな
要するにT aという型のコンテナTに対して、格納しているa型の値に直接触れずに、
コンテナの構造だけを変えたり(flatten :: forall a. Tree a -> [a]、tail :: forall a. [a] -> [a]とか)、
コンテナ自体の情報を返す(length :: forall a. [a] -> Int)類の関数。
特にリストのhead、(!)とか、タプルならfst、sndみたいに値を取り出すような関数も、
中身に触れなければ型に依存しない性質は保たれるってのは重要。
0726デフォルトの名無しさん
2012/02/28(火) 07:44:27.79それは俺(>>721)に対する返信?
もしそうなら、>>721 のページで言ってる forall = 積集合 という場合の集合は、
{⊥, 0, -1, 1, -2, 2, ...} を要素に持つInt型という名前の集合
{⊥, True, False } を要素に持つBool型という名前の集合
{⊥, "kyu-ri", "daikon", ...} を要素に持つString型という名前の集合
・・・
という意味の集合だと思うんだけど
で、例えば forall a. a は「全ての型(集合)の積集合」だから、
{⊥} を要素に持つ集合、つまり⊥しか値を取り得ない型になる
これと >>722 との繋がりがよく分からない(繋がった話ならという場合だけど)
>>725
同じだ、俺も今まで似たような考え方でやってきたんだ
それはそれとして、では >>721 のページに載っている考え方だと、
MkT :: forall a. a -> T はどう説明できるのかなという話
0727デフォルトの名無しさん
2012/02/28(火) 10:03:32.17Int型はIntの値の集合ではなく、Intの値を取り出せるデータ構造の集合だ、と定義すればいい。
例えば、0というデータから取り出せるのはIntだけでなく、Doubleも取り出せる。
forall a. a->TからはInt->TやDouble->Tなどを取り出せる。
0728デフォルトの名無しさん
2012/02/28(火) 12:47:20.41いや、ちょっと待って
そうやって勝手に話の前提を変えた場合、>>721 のリンク先の話は
ちゃんと整合性を保って説明できるのだろうか
(整合性を保って説明できるように隠れた定義を暴き出してくれたのなら大変有り難いが)
リンク先ではハッキリと
Bool is the set {True, False, ⊥},
Integer is the set of integers (and bottom),
String is the set of all possible strings (and bottom),
and so on.
と定義されていて、これを前提にしてその後の話が続いている
> forall a. a->TからはInt->TやDouble->Tなどを取り出せる。
もしそうだとすると、forall a. a からは Int も Double も取り出せるということ?
0729デフォルトの名無しさん
2012/02/28(火) 13:07:28.91MkT :: forall a. a -> Tはどんな値でも取ってT型を返す関数。
全称量化することで、型パラメータaが取り得る全ての型に共通の性質だけにしか言及できなくなる。
で、結局の所、⊥か、それ以外の何かが入ってる、としか言えなくなる。
(もちろんisBottomみたいな関数は定義できないから、実質何が入ってるかは不明)
forallが積集合云々ってのは、このことを言いたいんじゃないかと思う、多分。
一応、
foo (MkT x) = x :: T -> a
bar (MkT x) = id x :: T -> a
dup (MkT x) = (x, x) :: T -> (a, a)
みたいな関数は定義できる。
まぁT型の定義じゃ意味のある関数は定義できないけれど、値を取り出して関数適用するだけならおkだから、
型制約付けといたり、関数とセットで入れとくと、OOPっぽいポリモーフィズムできるようになったりする。
ttp://www.kotha.net/ghcguide_ja/latest/data-type-extensions.html#existential-quantification
(件のページのNotesみて初めて知ったけど、WHNFに簡約はできるって発想は無かった…)
0730デフォルトの名無しさん
2012/02/28(火) 13:59:49.98ggrksとか言わないで下さい。ググッた結果↓
⊥ に一致する情報は見つかりませんでした。
0731デフォルトの名無しさん
2012/02/28(火) 20:16:28.02⊥ はボトムと読みます
0732デフォルトの名無しさん
2012/02/28(火) 21:17:38.370733デフォルトの名無しさん
2012/02/28(火) 23:59:59.800734デフォルトの名無しさん
2012/02/29(水) 02:29:52.310735デフォルトの名無しさん
2012/02/29(水) 03:25:58.19Haskellerが読むようなものじゃない。
0736デフォルトの名無しさん
2012/02/29(水) 06:23:56.45『すごいHaskell たのしく学ぼう!』
* 田中英行、村主崇行訳
* オーム社
* 2012年5月発売予定
まあいいんだけど、タイトルダサいな。
0737デフォルトの名無しさん
2012/02/29(水) 07:53:36.61> 全称量化することで、型パラメータaが取り得る全ての型に共通の性質だけにしか言及できなくなる。
>>726 でも言ったが、俺も普段は似たような考え方で forall を扱っている
しかし、この考え方とリンク先のページで述べられている考え方との整合性がなんか上手く取れないんだ
(たぶん同じ forall について我々とリンク先は別の視点、捉え方で見ていると思うんだ)
> ⊥しか取りえないってのは間違い。
例えば >>726 を繰り返すが
(読み返してみて、誤解を与える表現に気づいたので括弧は外した)
⊥, 0, -1, 1, -2, 2, ... を要素に持つInt型という名前の集合
⊥, True, False を要素に持つBool型という名前の集合
⊥, "kyu-ri", "daikon", ... を要素に持つString型という名前の集合
ゆえに forall a. a は ⊥ を要素に持つ(名前は知らん)集合
という考え方を取っている(これはハッキリ書かれている、と俺は思う)
貴方や俺が普段取っている「型パラメータaが取り得る全ての型に共通の性質」という考え方ならば、
例えば forall a. (Show a) => a とすれば、その共通する性質をさらに (Show a) と絞り込む
という風に素直に考えられ、実際のコンパイラの挙動とも合致する
しかし、リンク先の考え方だと、forall a. a で {⊥} という集合なら、
これに対して (Show a) という性質で絞り込むことがちょっと想像できない
forall a. a -> T についても同じ
リンク先の言いたいことは何なんだろうというのが疑問なんだが、
申し訳ない >>729 でもまだ疑問が解消されない
(やっぱりそう考えた方が今はまだ分かりやすいな、という気持ちは再確認できたが)
0738デフォルトの名無しさん
2012/02/29(水) 16:00:11.89737は「aの性質を考えると、共通の要素は⊥しかない」と言っている
つまり、型を考えるのをやめれば便利なものを作れるが、
型を考えると、そんな便利なものは存在しないということを証明できる
0739デフォルトの名無しさん
2012/02/29(水) 19:01:47.59ごめん、どういうことなのか、ちょっと分からない
混乱してる
>>737(俺)が言ってるんじゃなくて、言ってるのは俺が示したリンク先のページだよ
そして、aの性質を考えるとじゃなくて、forall の性質=積集合を考えると、ね
a は単に forall に束縛された型変数で、重要な性質を持ってるのは forall の方だと俺は思う
よく分からないけど、俺の疑問の解消に少しでも繋がるような
何か証明ができるのなら、是非してみてほしい
お願いする
0740デフォルトの名無しさん
2012/02/29(水) 20:01:40.01じゃあMkTという関数があってMkTの型(a->T)は(aに関しては)重要ではないとする
重要ではないので適当に
MkT ∈ (Int->T)
MkT ∈ (Bool->T)
MkT ∈ (String->T)
・・・
ということにすればMkT ∈ (forall a. (a->T))
だから(forall a. (a->T))には⊥以外の要素が入っている
0741デフォルトの名無しさん
2012/02/29(水) 20:17:30.41確認したいんだが、
MkT ∈ (Int->T)
MkT ∈ (Bool->T)
MkT ∈ (String->T)
・・・
これは全て AND で結ばれているんだよな
つまり、全ての積集合を意味しているんだよな
{MkT ∈ (Int->T)} AND {MkT ∈ (Bool->T)} AND {MkT ∈ (String->T)} ...
0742デフォルトの名無しさん
2012/02/29(水) 20:46:56.98そうだね
ANDだね
0743デフォルトの名無しさん
2012/02/29(水) 20:58:30.820744デフォルトの名無しさん
2012/02/29(水) 21:00:47.10どうして?
0745デフォルトの名無しさん
2012/02/29(水) 21:21:11.490746デフォルトの名無しさん
2012/03/01(木) 02:57:49.52{ ⊥, (\x -> T), (\x -> let _ = x + 1 in T), ... }
(String -> T)は
{ ⊥, (\x -> T), (\x -> let _ = x ++ "foo" in T), ... }
forall a. (a -> T)は
{ ⊥, (\x -> T) }
0747デフォルトの名無しさん
2012/03/01(木) 03:05:14.44forall a. (a -> T)は
{ ⊥, (\x -> T), (\x -> let _ = x in T), ... }
だった
つまり書く集合の内xをIntなどの具体的な型として
扱っていない項だけが残る
0748デフォルトの名無しさん
2012/03/01(木) 07:23:19.60すげー分かりやすかった
なるほど、forall a. a の時のように、
ちゃんとそれぞれの型の場合の取り得る値の集合の積で考えられるんだ
合点がいった
ありがと
スッキリしたから、もう少し先まで読み進めてみる
0749デフォルトの名無しさん
2012/03/01(木) 12:01:47.26PHP「掲示板作りました!」
Ruby「Railsで住所管理アプリ作りました!」
Java「帳票管理ソフト作りました!」
ActionScript「ゲーム作りました!」
Lisp「Lisp作りました!」
Haskell「美しい言語だ…(成果物無し」
Haskellやる理由ってエンジニアとしてのステータスなんだよね
昔の言語LISPに触れるとか、古参気取ったり
インテリンゲンジャを気取るためにHaskellやってますとかね
馬鹿じゃねーの?wwwwwwwwwwwww
死ねよいいから
お前ら目さませよクズ!?!!?
本当に!!
おまえらさ!?
Haskellやってて
名に作ったの?
クズHaskell使い「作ったとかじゃなくて・・・そもそも何故作るのか」
スキルアップ(笑)で終わってると思うよお前ら
Matzの布教活動に釣られたクズ当然だなwwwwwwwwwwwwwwwwwwwwwwwwwwww
0750デフォルトの名無しさん
2012/03/01(木) 12:07:21.59これは新しい
0751デフォルトの名無しさん
2012/03/01(木) 12:09:43.91マイナーがかっこいい
とか美徳感じてるクズばっかりだからな
0752デフォルトの名無しさん
2012/03/01(木) 12:22:52.870753デフォルトの名無しさん
2012/03/01(木) 12:34:25.86高学歴娼婦みたいで
0754デフォルトの名無しさん
2012/03/01(木) 12:46:48.450755はちみつ餃子 ◆8X2XSCHEME
2012/03/01(木) 13:27:09.96「げんしゃ」だと資産家のことを意味する方言 (古語) 。
http://www.weblio.jp/content/%E3%81%92%E3%82%93%E3%81%97%E3%82%83
お高くとまっている様子を言うこともあるのでこの場合はこっちの方が妥当かも。
0756デフォルトの名無しさん
2012/03/01(木) 13:34:42.64AVで笛吹いたりするのか
0757デフォルトの名無しさん
2012/03/01(木) 14:11:47.76>>Lisp「Lisp作りました!」
この一行の手抜きで、忍者ではないと判る。
0758デフォルトの名無しさん
2012/03/01(木) 14:42:54.030759デフォルトの名無しさん
2012/03/01(木) 16:02:15.78話の主軸を見誤るな
0760デフォルトの名無しさん
2012/03/01(木) 16:34:30.58特に、数学を知らないことで無駄に遠回りしてしまうことを恐れている
0761デフォルトの名無しさん
2012/03/01(木) 16:40:52.53パイオニアがやる事とは違うが。
0762デフォルトの名無しさん
2012/03/01(木) 17:01:30.780763デフォルトの名無しさん
2012/03/01(木) 17:07:15.13Haskellできる人は凄いと聞きました
http://macintoshgarden.org/sites/macintoshgarden.org/files/screenshots/Traitor_heads_0.jpg
このゲームをWindowsに移植してください
お願いです;;
0764デフォルトの名無しさん
2012/03/01(木) 20:36:10.700765デフォルトの名無しさん
2012/03/01(木) 21:40:37.11掲示板とか住所管理とかしょぼいのばっかだな、、、
0766デフォルトの名無しさん
2012/03/01(木) 21:48:26.24そういえばrailsが出た頃は15分でblog作るデモとかあったな
実用性のアピールにはあぁいうインパクト大事
0767デフォルトの名無しさん
2012/03/01(木) 21:54:11.82なんかさ 高速化〜言語がどうたら とか難しい話言われてもちっともうれしくねえし
そういうのつまんなくね
ゲームとかブログとか作るとかの法が楽しいし
本当に馬鹿だよな
最適化とか高速化とかつまんね
〜〜を返してみる とか やめて欲しい
実用性のインパクトが大事
ニコニコ動画はフラッシュプレイヤー作ってますとかインパクトなさすぎるのとおなじだね
0768デフォルトの名無しさん
2012/03/01(木) 21:54:55.57無理してる布教に釣られたクズばっかり
0769デフォルトの名無しさん
2012/03/01(木) 22:02:06.47O'REILLY のサイトだと 300 ページって書かれてるのに、
他の Amazon とかだと 100 ページつて書かれてるんだよな
どっちだよ
100 ページってハンドブック?
0770デフォルトの名無しさん
2012/03/01(木) 22:11:32.18インテリゲンチャのタイポだろ。なんだ修験者って。
0771デフォルトの名無しさん
2012/03/01(木) 22:50:53.25バグやエラーをあえて発生させそれを強い型付けとかランダムテストを使いながら
確実に取り除いていく様子を見せるようなデモがいいだろうな
簡単に作れるとかだと「じゃあrailsでいいよね」とかいうオチになるから
0772デフォルトの名無しさん
2012/03/02(金) 01:29:04.91あとはIIJあたりも社内Haskellで統一して、MOGOKやめてYesodのサービス始めれば援護になる。
なんでそうならないんだろうね。
0773デフォルトの名無しさん
2012/03/02(金) 09:06:18.040774デフォルトの名無しさん
2012/03/02(金) 10:06:46.620775デフォルトの名無しさん
2012/03/02(金) 21:14:41.55別に四則演算なんてしなくても
ビット演算したいケースなんて普通にあるだろ
Word32でnewtipeした型をBits宣言したいけど
四則演算は禁止したい
こんなときどうすれば良いの?
0776デフォルトの名無しさん
2012/03/02(金) 22:47:19.28これ↑を読んでたんですけど
Functorのインスタンスを説明するところで((->) e)はファンクタだって記述がありました。
GHCIとかで:typeしてもエラーにしかならないんですけど
(->)ってのは普通の演算子じゃなくて、型宣言のところに出てくるアレって解釈であってますか?
よくわかってないですが、型より一段階メタな種を扱う演算子みたいな扱い??
もし可能であれば、((->) e)のFunctor実装がどんな感じになるか教えてもらえないでしょうか。
0777デフォルトの名無しさん
2012/03/02(金) 23:25:53.07Bitsクラスをただのビット列表現と解釈しているから不条理に思えるのでは?
ライブラリドキュメントにはこうハッキリと書かれている
The Bits class defines bitwise operations over integral types.
これは、integral types に対してビット演算を提供するクラスなんだよ
だから fromIntegral 関数を持つ Num クラスのインスタンスである必要がある
integral types ではない型に対してビット演算を提供するクラスは、
今のところ標準ライブラリには入っていない
(HackageDB にも、貴方の望むライブラリは今のところなさそうだ)
また、Num のクラスメソッドを使用した場合に実行時にエラーを出す方法はあるが、
GHC によるコンパイル時にエラーを出す方法は、これまた今のところない
よって、そのようなビット列表現および演算するクラスが必要なら、
残念ながら自作するしかない
0778777
2012/03/02(金) 23:27:31.24訂正
誤) だから fromIntegral 関数を持つ Num クラスのインスタンスである必要がある
正) だから fromInteger 関数を持つ Num クラスのインスタンスである必要がある
0779デフォルトの名無しさん
2012/03/02(金) 23:29:54.570780777
2012/03/03(土) 00:09:57.84> GHCIとかで:typeしてもエラーにしかならないんですけど
では、そのすぐ上に Either e も「Functor のインスタンス」だという説明がありますが、
これも :type を試されましたか?
エラーが出ますよね
だって、Either も (->) と同じように関数や演算子じゃないから
「〜は*のインスタンス」と言った場合、〜の部分には「型」がきます
型の情報は :type では得られません(:type は値の型情報を得るもの)
型の情報は :info などで得られます
ただし、正確には :info には型ではなく型構築子を指定しないといけません
(たとえば :info Either e ではなく :info Either)
と言うことで、((->) e) は単なる型であり、意味上は何も特別なことはありません
試しに :info (->) をすれば、((->) r) 型が Functor のインスタンスだと分かります
正確に言えば (->) が種 * -> * -> * の型で、((->) e) が種 * -> * の型です
((->) e) 型のFunctor実装は処理系依存でライブラリでは公開されていませんが、
次のように解釈できるような実装になっているはずです
instance Functor ((->) e) where
fmup f g = f . g
0782デフォルトの名無しさん
2012/03/03(土) 00:31:28.38instance Functor ((->) e) where
fmap = (.)
0783デフォルトの名無しさん
2012/03/03(土) 00:37:41.580784デフォルトの名無しさん
2012/03/03(土) 00:48:51.17なるほど、型と値をごっちゃに考えてたせいで要領を得ない質問になってました。
手がかりは頂いたので、もうちょっと考えてみます。
詳しい解説ありがとうございました。
■ このスレッドは過去ログ倉庫に格納されています