このブログ記事では、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 Stringtypeとは打って変わって、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.