Haskellerへの道 #17 - data, type, newtype

Last Edited: 7/11/2024

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

Haskell & Types

振り返り

以前の「Haskellerへの道 #8 - データ型」で、次のような新しいデータ型を定義する方法について紹介しました:

data Tree a =
    Leaf | Node (Tree a) a (Tree a)

このトピックに自信がない場合は、次に進む前に復習しましょう。)しかし、Haskellには類似した概念があります: typenewtypeです。これらは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で作成された新しい型はチェックされますが、実行時には無視されます。

クイズ

この記事では、学習した内容を確認するためのクイズを設けます。記事のメイン部分を読んだ後に、ぜひ自分で問題を解いてみることを強くお勧めします。各問題をクリックすると答えが表示されます。

リソース