Skip to content

Commit cc30330

Browse files
author
Mizunashi Mana
committed
Fix by reviews
1 parent bf2b8f1 commit cc30330

File tree

1 file changed

+3
-3
lines changed

1 file changed

+3
-3
lines changed

preprocessed-site/posts/2020/how-to-use-type-newtype-data.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ type FilePath = String
5959

6060
文字列は文字のリストと見做せるそこから文字列によるデータ型 `String` は単に文字のリスト型の型シノニムで定義されている文字列に対してリストの関数を自由に適用できるのはこのためだファイルのパスによるデータ型 `FilePath` は `String` の型シノニムで定義されているなので文字列の関数を自由に適用できる
6161

62-
Haskell の型シノニムはこれだけに止まらずもっと強力な機能も持っている例えば型シノニムは型コンストラクタに対しても作れる:
62+
Haskell の型シノニムはこれだけに止まらずもっと強力な機能も持っている例えば型シノニムは型コンストラクタすなわち型を受け取って新たな型を作るコンストラクタに対しても作れる:
6363

6464
```haskell
6565
type Option = Maybe
@@ -244,7 +244,7 @@ data Nat
244244
data Tuple a b = Tuple a b
245245
```
246246

247-
`(a, b)` と構造が同じであり`(a, b)` に対する関数 `fst :: (a, b) -> a` を適用できてもいいはずだしかしデータ型 `Tuple a b` は自身が `(a, b)` と同じ方法でしか構成できないことを知らない`Tuple a b` と `(a, b)` において型上で言及できることはそれらが異なる型であると言うことだけだなので`fst` に `Tuple a b` 型の値を渡すことはできないこれはもし型シノニムを使って
247+
`(a, b)` と構造が同じであり`(a, b)` に対する関数 `fst :: (a, b) -> a` を適用できてもいいはずだところがデータ型 `Tuple a b` とその値コンストラクタは型システム上は切り離されているため自身の値が `(a, b)` の値と同じ方法でしか構成できないことを知らない`Tuple a b` と `(a, b)` において型上で言及できることはそれらが異なる型であるということだけだなので`fst` に `Tuple a b` 型の値を渡すことはできないこれはもし型シノニムを使って
248248

249249
```haskell
250250
type Tuple a b = (a, b)
@@ -447,7 +447,7 @@ True
447447
>>> "aBc" == CaseInsens "Abc"
448448
```
449449

450-
としてしまうと,コンパイルエラーになってしまう.なぜなら,`(==)` は2つの引数が同じ型の値である必要があり,`"aBc"` の型である `String``CaseInsens "Abc` の型である `CaseInsensString` は全く異なる型であるからだ.つまり,値コンストラクタ `CaseInsens` は,実行時には何の影響も与えないが,型システム上はこの全く異なる型の値になることを判断するためのマーカーとしての役割を持つ.そして,型シノニムではデータ型は単なる別名であったが,`newtype``data` と同様全く新たな型として導入する道を選んだため,元の型として受け入れてもらうことが出来なくなってしまったのだ.
450+
としてしまうと,コンパイルエラーになってしまう.なぜなら,`(==)` は2つの引数が同じ型の値である必要があり,`"aBc"` の型である `String``CaseInsens "Abc` の型である `CaseInsensString` は全く異なる型であるからだ.つまり,値コンストラクタ `CaseInsens` は,実行時には何の影響も与えないが,型システム上は全く異なる型の値であることを示すマーカーとなる.そして,型シノニムではデータ型は単なる別名であったが,`newtype``data` と同様全く新たな型として導入する道を選んだため,元の型として受け入れてもらうことが出来なくなってしまったのだ.
451451

452452
といっても,これは一長一短である.`data` と同様 `newtype` で作られた型は,型シノニムのように既存の関数を使い回すことができない.その反面,データの意味に沿わないプログラムを型によって弾くことができるという点は長所になる場合もある.例えば,`"aBc" == CaseInsens "Abc"` の例は,一体どのような結果を返すべきか一見して分からない.両者は単なる文字列と,大文字小文字を区別しない文字列という異なるデータを表しており,その比較は定義されないとするのが自然だろう.このような場合に,型シノニムでは定義されないことを表す方法はなかったが,`newtype` は元の型と異なる型を持つので,そのような仕組みを作ることができる.
453453

0 commit comments

Comments
 (0)