2025年9月26日金曜日

Haskell 代数的データ型、レコード記法(data)とnewTypeについて

 〇 data BookInfo = Book Int String [String] deriving (Show)
型コンストラクタ名 =データコンストラクタ名 フィールドの型1 フィールドの型2,,,
(新しい型の名前=型構成子)   (値構成子)      (構成要素1,2,,,,)
データコンストラクト名を関数として扱い、Int,String,,,という型の引数に適用するとBookInfoの型の新しい値を生成できる   myInfo=Book 978~ "〇〇" ....

〇 data Bool = False | True   代数的データ型  パターンマッチで使用

〇 レコード記法:フィールドに名前
data Employee = NewEmployee { employeeAge :: Integer , employeeName::String,...}
 employee = NewEmployee { employeeName="~ ,em~   }
   employeeName employeeで名前にアクセスできる アクセサは関数

〇newType NewtypeInt  = N Int deriving (Eq,Ord,Show) N 1< N 2は Ordで可、+不可
    data DataInt = D Int  deriving (Eq,Ord,Show)と比べると制限がある
 ・ちょうど一つのフィールドのみ可   newType Okay=ExactlyOne Int
 ・パラメータは問題なし  newType Param a b = Param (Either a b)
    レコード記法も可  ただしフィールド無は不可 複数の値構成子も不可

newType NTIndexed a =NewNTIndexed { unNTIndexed :: (Integer,a)} deriving Show
 NewNTIndexedとunNTIndexedが、NtIndexed aと (Integer,a)を行き来するための関数として使えるのが便利らしい。

※なお、newtype Ph a = MkPh (Int,a)として、:t MkPhとしてみたらMkPh :: (Int, a) -> Ph aとなりました。 外側から見ると Ph aでも、中身は (Int,a)ということになります。内部構造 (Int, a) は隠して、簡潔に見せたいという考え方?

0 件のコメント:

コメントを投稿