このブログ記事では、Haskellのややこしい概念、data, type, newtypeを紹介します。

振り返り
以前の「Haskellerへの道 #8 - データ型」で、次のような新しいデータ型を定義する方法について紹介しました:
data Tree a =
Leaf | Node (Tree a) a (Tree a)
このトピックに自信がない場合は、次に進む前に復習しましょう。)しかし、Haskellには類似した概念があります:
type
とnewtype
です。これらはdata
とどう違うのでしょうか?
同義の型
多くの言語で、String
と[Char]
は同等であるか同義であると見なされます。Haskellも例外ではありません。
String
は以下のように[Char]
の同義の型として定義されています:
type String = [Char]
この構文は誤解を招くかもしれませんが、type
は全く新しい型を作成するのではなく、既存の型の同義の型、呼び名を与えます。
そうすることで、コードを簡素化し、可読性を向上させることができます。同義の型はパラメータを持つこともできます:
type AssocList k v = [(k, v)]
同型写像:
type
に非常に似た構文にnewtype
というものがあります。これは具体的に何をするのでしょうか?
newtype
はズバリ、data
の1つのコンストラクタと1つのフィールドのみしか持てないバージョンです。
以下は、newtype
がどのように使用されるかの例です:
newtype Name = Name String
type
とは打って変わって、newtype
は実際には既存のデータ型を基に新しいデータ型を作成します。
既にdata
があるのにこれが役立つのはなぜでしょうか?それは、newtype
が新しい型とそのフィールドの型が直接対応していることを保証するからです。
これを同型写像と呼びます。コンパイル時に、newtype
で作成された新しい型はチェックされますが、実行時には無視されます。
クイズ
この記事では、学習した内容を確認するためのクイズを設けます。記事のメイン部分を読んだ後に、ぜひ自分で問題を解いてみることを強くお勧めします。各問題をクリックすると答えが表示されます。
リソース
- Philipp, Hagenlocher. 2020. Haskell for Imperative Programmers #21 - data, type & newtype. YouTube.
- NA. Making Our Own Types and Typeclasses. Learn You a Haskell for Great Good.