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