haskell-ja > Archives > 2009/06/30

2009/06/30 01:31:05 UTCcut-sea
#
newtypeとtypeって何が違うのか簡単に説明してー
#
よくnobsunが言ってる例がでてきたんだけどイマイチピンとこない
#
型コンストラクタだけexportしておいてデータ構成子をexportしないことで
#
そのライブラリをimportして使う人に内部実装をいじらせないようにする例がでてきたんだけど
#
その時にnewtypeを使ってる
#
文章からするとnewtypeにえらくこだわっているんだけど
#
typeにするのとnewtypeにするのでどう違うかよーわからん
2009/06/30 02:21:11 UTCcut-sea
#
今日聞いたらkiwadaくんも参加してたらしい
#
40位のNASUってのがそうらしい
#
やるなー
#
C++使い
2009/06/30 02:58:21 UTCcut-sea
#
やっぱiPhone 3GS欲すいー
#
同僚が持っててやっぱ楽しそうだよ
#
ううーガマンできん!
2009/06/30 04:20:46 UTCcut-sea
#
http://blogs.dion.ne.jp/keis/archives/5880105.html
#
フムフム
2009/06/30 13:20:43 UTC[1..100]>>=pen
#
私が見たことがある type と newtype の違いは
#
type Int1 = Int
a1 :: Int1
a1 = 5 :: Int
#
はOKだけど
#
newtype Int2 = Int
a2 :: Int2
a2 = 5 :: Int
#
はNGってやつ。
#
単なる別名とみるか違うものとみるか。
2009/06/30 13:27:21 UTC[1..100]>>=pen
#
あれ newtype Int2 = Int がそもそも書き間違い
#
なんか勘違いして覚えてた。
#
6.1 Newtype 宣言 プログラミングの際によくやるのが,表現が既存の型と同一だが,型システムの中では別の型として識別されるような型を定義することです。
#
をへんな風に記憶してた。
2009/06/30 13:57:28 UTCcut-sea
#
そうか、とりあえずtypeの場合には元の型のaliasなだけだからexportしないつもりでも実質隠ぺいにはならないのね。
#
newtypeがどうなるのかについては未だに整理できてないけど、とりあえずtypeについてはなんとなくわかりました。
#
サンクスです
2009/06/30 14:04:59 UTCnobsun
#
typeは別名なので新しい型をつくったわけではない。
#
newtypeは新しい型
#
type Int2 = Int
#
とした場合Intがもつ性質はすべてInt2でも同じ、つまり名前がちがうだけで、Int2とIntは完全に同じ。
#
newtype Int2 = I Intとした場合は、内部実装上はInt2とIntは同じだが、完全に別の型。だから、とうぜんこの定義のままI 2を評価すると、Showのインスタンスではないから、表示できない。
2009/06/30 14:19:20 UTCcut-sea
#
とすると、この隠ぺいの話としてはnewtypeじゃなくてdataでも成立するはずなんですよね
2009/06/30 14:20:03 UTCnobsun
#
そうです。
2009/06/30 14:54:31 UTCcut-sea
#
このnewtypeの説明何度も質問して聞いてるけど、使い分けるに至ってない
#
で、型をexportしているけど構成子をexportしない場合
#
当然データを構成できないから、それを扱う関数が使えないってのはいいのですが
#
型だけ公開されてどううれしいんだっけか
2009/06/30 16:44:50 UTC[1..100]>>=pen
#
「100xでは燃料無駄使いした方がいい」
えー、こんなのあったのか!
2009/06/30 20:11:50 UTCnobsun
#
データ構成子というのはその型の実装だから。実装を公開すると、あとから実装を変更できなくなる。たとえば、Stack aという型と、empty :: Stack aとisEmpty :: Stack a -> Boolとpush :: a -> Stack a -> Stack aとpop :: Stack a -> Maybe (a, Stack a)およびtop :: Stack a -> Maybe aという一連のAPIを公開しておけば実装を隠せる。
#
> cut-sea
2009/06/30 23:01:25 UTCcut-sea
#
ありがとうございます
#
でもどの関数でもStack aを引数に取るわけだから結局Stack aの値構成子がないと
#
Stackライブラリのユーザはこれらの関数を使えなくないですか?
#
あーそうでもないのか
#
point freeで書けばいいってことなのかな
2009/06/30 23:05:04 UTCikegami
#
日曜日の朝に頭が爆発して、気がついたら今日でした
#
みなさまおつかれさまです
#
newtype なくても data でいいじゃん、というのは一理ある
#
ただ、data AnothorInt = AI Int を newtype AnotherInt = AI Int と書くのにも理由があって
#
たしか、実装上速くできるんじゃなかったかな
#
あと、隠蔽の他にも
#
正格評価されちゃうデータを遅延させたいときにもつかう
2009/06/30 23:08:19 UTCcut-sea
#
おつかれさまでした
#
私はまだまだhaskellでやりたいことが書けません
2009/06/30 23:09:45 UTCikegami
#
5 段組のモナドで VM 書いて、program counter を触れるのは「王様」だけ、という VM ができたので、そこで満足してしまった
#
前に WhiteSpace の VM 書いたときは、ひらべったい State モナドにしてしまったために、バグが頻出してこまった
2009/06/30 23:11:23 UTCcut-sea
#
正格評価されちゃうデータを遅延させるってのは?
#
今のIntの例だとわかりにくいのかな
2009/06/30 23:15:12 UTCikegami
#
や、Haskell98 だったか GHC 拡張だったか、忘れたので調べていた
#
データ型になにかつけると、正格評価できるんだけどどういう文法だっけか
2009/06/30 23:16:00 UTCcut-sea
#
!とか?
#
この前sakaiさんが使ってたようだけど
2009/06/30 23:17:08 UTCikegami
#
Haskell 98 だな、! ですね
#
data SI = !SI Int
#
と定義すると
#
正格評価になる
#
きちんというと、 SI 1 は \x -> SI $! 1 に変換されると Haskell 98 レポートに書いてある
2009/06/30 23:21:58 UTCcut-sea
#
1に正格評価されるってのは・・・・
#
3 + 5 => (+) 3 5でこれはlambdaが出てきた形とみなしてよいのでしょうか?
2009/06/30 23:22:43 UTCikegami
#
しまった、SI x は \x -> SI $! x のことです
2009/06/30 23:22:51 UTCcut-sea
#
とするとこれはWHNFってことで評価止まりますよね
#
聞いておきながら途中ですみません。シャワーあびて職場に向かいます
2009/06/30 23:24:57 UTCikegami
#
はいわかりました
2009/06/30 23:58:05 UTCnobsun
#
point freeは関係なくて、Stack a のAPIとして上のempty, push, popだけがあればよいですよね。実装を知る必要はない。> cut-sea