Haskell の newtype の使いどころ
newtype、まだつかったことないでし…
— (deffish *tai*) (@taiki45) 2014, 2月 3
newtypeはその制約のおかげで構造を入れやすいから汎用的な構造つきデータを表現するのに便利 typeは型に別名を与えたいときとか型変数に「意味」をもたせたいときに便利
— みょん (@myuon_myon) 2014, 2月 3
あとtypeだと既存の函数が同じように流用できるので、typeで宣言したものに対する操作を再定義する必要がないからportablityが上がる(Lensみたいに)
— みょん (@myuon_myon) 2014, 2月 3
そもそもtypeとnewtypeは使い所が全然違うのでどっちがいいとかいうようなものではないと思いますけどね
— みょん (@myuon_myon) 2014, 2月 3
typeってほんとにタダの別名でしかないので可読性上げる以上の意味あるのかなってずっと思ってるマン #だから基本newTypeの方が良くねっていう長年の疑問
— co1row.jp (@co1rowjp) 2014, 2月 3
data書いてみて型コンストラクタが*->*だったらnewtypeにするっての、良くやる。
— ちゅーん (@its_out_of_tune) 2014, 2月 3
@taiki45 newtype宣言は実行時には捨てられてるから、単にその方がパフォーマンス良いだけでつ。一般的な使い方はパスベルスが言ってるように、既存の型に制約とか別の性質を与えたりするのに使いますベルス。
— ちゅーん (@its_out_of_tune) 2014, 2月 3
@taiki45 うい(´・ω・`)
— ちゅーん (@its_out_of_tune) 2014, 2月 3
同じ中身に違う性質を持たせたい→newtype
同じ性質に違う名前を持たせたい→type
— ふみ(DJ Monad) (@fumieval) 2014, 2月 3
typeのすごく簡単な例で、filter関数の特殊な例を出したりする。filterBook :: BookFilter -> BookList -> BookList みたいなの。
— ちゅーん (@its_out_of_tune) 2014, 2月 3
type BookFilter = Book -> Bool
— ちゅーん (@its_out_of_tune) 2014, 2月 3
このBookFilterっていう別名、idxFilter :: Int -> BookFilterとか、nameFilter :: String -> BookFilterみたいな関数考えてようやく効果が解ってくる(´・ω・`)
— ちゅーん (@its_out_of_tune) 2014, 2月 3
まぁ、ぶっちゃけ、このくらいならやらないけど(´>ω∂`)
— ちゅーん (@its_out_of_tune) 2014, 2月 3
typeのコメント的な使い方は変数名で十分なことが多い
— Kasio Hino (@hiyakashi_) 2014, 2月 3
newtypeでなくてtypeを使う意味は「これは単なる、わかり易くするための型の別名である」って事を明記するためなのねん。
— ちゅーん (@its_out_of_tune) 2014, 2月 3
newtype は GeneralizedNewtypeDeriving を使うときよく使う
— パスベルス (@pasberth) 2014, 2月 3
type で宣言すると,できなくていい操作もできてしまうので newtype で宣言して必要なものだけ deriving するのが好きです
type MyType = String
newtype MyType = MyType String deriving IsString
— パスベルス (@pasberth) 2014, 2月 3
たとえば String に対して異なる Monoid の定義を与えたいとかの場合は newtypeにします
— パスベルス (@pasberth) 2014, 2月 3
type で alias をつけるのと, newtype で宣言してすべての性質(型クラス)をderivingで継承するのとは基本的に同じことです.
— パスベルス (@pasberth) 2014, 2月 3
たとえば C_1, C_2, .., C_n っていう型クラスのインスタンスである T があるとします.以下の2つはほとんど同じです:
type U = T
newtype U = U T deriving (C_1, C_2, .., C_n)
— パスベルス (@pasberth) 2014, 2月 3
たとえば t :: T と f :: U -> W とがあったとき, type の場合は f t のように呼べますが newtype の場合は f (U t) のように呼ばなくてはならないなど,コンストラクタを介さないと値をつくれないという違いはありますが,
— パスベルス (@pasberth) 2014, 2月 3
性質としては同じものだと考えられます.このことから, type で別名をつけることは, newtype でもできるといえます(newtypeですべての型クラスをderivingすればよろしい).
— パスベルス (@pasberth) 2014, 2月 3
また,すべての型クラスをderiving *していない* 場合の newtype は, type に制約をつけたものと考えられます.つまり type で別名をつけることに,特定の型クラスは継承しない,という制約をつけたものが newtype であるということです.
— パスベルス (@pasberth) 2014, 2月 3
そういう理由で「typeで書いたものはnewtypeでも書ける」とか「typeは必要ない操作もできてしまうのでnewtypeのほうが好き」と発言した次第です
— パスベルス (@pasberth) 2014, 2月 3
ちゅーんさんは型コンストラクタが邪魔にならないtype宣言は好きでつ。愛用しまくりんぐ。
— ちゅーん (@its_out_of_tune) 2014, 2月 3
関数の型にtypeで別名を付けるのは慎重にならなければいけない
— ふみ(DJ Monad) (@fumieval) 2014, 2月 3
newtypeとtypeの同質性って、A:X→F(X), B:F(X)→Xとした時、Id_X=B〇Aになる、とか多分そんなん。
— ちゅーん (@its_out_of_tune) 2014, 2月 3
newtypeをtype的に使うの完全に無意味感がある(そういうふうにも使える、という意味ではあれだけど議論する価値はあるのだろうか)
— 中2女子南山まさかず (@PG_nonen) 2014, 2月 3
なんだろう、typeとnewtypeを比較してるの、C++でclassの合成を使った擬似的なstrong typedefとtypedefを比較しているような感覚でなんかこううーん違和感
— 中2女子南山まさかず (@PG_nonen) 2014, 2月 3
目的も用途も違う機能を比較するのもなぁって気もするのだけれどううむ……むむむ……
— 中2女子南山まさかず (@PG_nonen) 2014, 2月 3
さっきも言ったけどむしろdataの特殊な場合の最適化用のものだと思っているのでdataと比較したほうがいいのでは……ううむ……
— 中2女子南山まさかず (@PG_nonen) 2014, 2月 3
僕としてはnewtypeはkindが*->*の場合のためのdataの代わり的なものがやはり意図されているんじゃないかという気がしてしまう(確かなことは設計者に聞くしか無い)
— 中2女子南山まさかず (@PG_nonen) 2014, 2月 3
まあ、dataとtypeの両方の性質と用途を適当にゴチゃっと合いの子にしてそれぞれちょいとずつ制限した感じのものがnewtype、ってのが正解なのかもしれない
— 中2女子南山まさかず (@PG_nonen) 2014, 2月 3
newtype はやはり名前にもある通り type に近いもので, type に制約を課せる機能だと思う.
— パスベルス (@pasberth) 2014, 2月 3
type は暗黙のうちにすべての型クラスを deriving して,暗黙の型変換(コンストラクタを介さなくても値をつくれる)を定義してくれるnewtypeなんですよ
— パスベルス (@pasberth) 2014, 2月 3
用途で比べるのか性質で比べるのか。
— ちゅーん (@its_out_of_tune) 2014, 2月 3
性質で言うなら、なんやかやdataとnewtypeが近いぽよ。IdentityとMaybe。
— ちゅーん (@its_out_of_tune) 2014, 2月 3
newtype aとaは同型
— みょん (@myuon_myon) 2014, 2月 3
@taiki45 newtype HexRGBA = HexRGBA Word32 ってやると 0xFFFFFFFF みたいな整数リテラルをRGBAカラー空間座標的に扱う方として利用できる(ということは CSS とか OpenGL 相手にする時に… あとはわかるね?)
— ぼうくん (@VoQn) 2014, 2月 3
@taiki45 FizzBuzz の例でも見せたけど、 型宣言するとリテラル相手にした時に引数はデータコンストラクタ呼ばなくても newtype 宣言した”それ”として扱われて便利なのよ。 show (3 :: FizzBuzz) これで済む
— ぼうくん (@VoQn) 2014, 2月 3
構成子が一つしかない&&構成子は固定の型&&データコンストラクタも1種しかない&&特定の型クラスのインスタンスとしての振る舞いは変えたい場合は newtype 使う(たぶん適切な用法は別にまだある)
— ぼうくん (@VoQn) 2014, 2月 3
@taiki45 よくあるパターンは cabal からもらって来る代数的データ型が便利でいいのだけど、自分が利用してる際に微妙にある型クラスとしての実装が歯がゆくなった時に、エイヤとnewtypeするケースとか。
— ぼうくん (@VoQn) 2014, 2月 3
@taiki45 あるいは自分が定義した型クラスを、プリインor外部ライブラリの型のインスタンスとして宣言するのに、影響範囲を限定したい時(自前モジュール内だけそうしたい)とか。ただこれあまりないケース
— ぼうくん (@VoQn) 2014, 2月 3
@taiki45 たぶん newtype の一番の真価は既存型に対して、型クラスのインスタンス宣言を「モジュールのAPIが果たすべきコンテキスト」に合わせて、他のモジュールと疎結合の状態で書き換えられる術がユーザーに与えられてる事
— ぼうくん (@VoQn) 2014, 2月 3
@taiki45 やろうと思えば代数的データ型をドメインオブジェクトのように、newtype で コンテキストに合わせ振る舞いを変えたように見せ、 型クラスを持ってインタラクションを、といった DCI 紛いの事はできると思うよ
— ぼうくん (@VoQn) 2014, 2月 3
newtype の強力さ、なんていうか『邪王炎殺黒龍波の真の力』みたいな説明になりがち…
— ぼうくん (@VoQn) 2014, 2月 3
GeneralizedNewtypeDeriving… ほむほむ…
— (deffish *tai*) (@taiki45) 2014, 2月 3
ついにnewtypeの本当の力に気づいてしまったか…
— Hideyuki Tanaka (@tanakh) 2014, 2月 3
ε( ε^o^)эほむほむほむほむ
おまけ
きさま、newtypeか
— 卒業しちゃう仮面 (@naota344) 2014, 2月 3
ε( ε^o^)эわろたでし