サーチ…


シンプルなデータ型の作成

Haskellでカスタムデータ型を作成する最も簡単な方法は、 dataキーワードを使用するdataです。

data Foo = Bar | Biz

型の名前はdata=間で指定され、 型コンストラクタと呼ばます。 After =データ型のすべての値コンストラクタを指定します |符号。 Haskellには、すべての型と値のコンストラクタが大文字で始まらなければならないというルールがあります。上記の宣言は次のように読むことができます:

Fooという型を定義します。これには、 BarBiz 2つの値があります。

カスタムタイプの変数の作成

let x = Bar

上記の文は、型Foo変数xを作成します。タイプを確認して確認しましょう。

:t x

プリント

x :: Foo

値コンストラクタパラメータを使用したデータ型の作成

値コンストラクタは、データ型の値を返す関数です。このため、他の関数と同様に、1つ以上のパラメータを取ることができます。

data Foo = Bar String Int | Biz String

Bar値コンストラクタの型を調べましょう。

:t Bar

プリント

Bar :: String -> Int -> Foo

Barが実際に関数であることが証明されます。

カスタムタイプの変数の作成

let x = Bar "Hello" 10
let y = Biz "Goodbye"

型パラメータを使用したデータ型の作成

型コンストラクタは、1つ以上の型パラメータを取ることができます:

data Foo a b = Bar a b | Biz a b

Haskellの型パラメータは、小文字で始まる必要があります。カスタムデータ型はまだ実際の型ではありません。タイプの値を作成するには、すべてのタイプパラメータを実際のタイプに置き換える必要があります。 abはどんな型でも構わないので、値コンストラクタは多相関数です。

カスタムタイプの変数の作成

let x = Bar "Hello" 10      -- x :: Foo [Char] Integer
let y = Biz "Goodbye" 6.0   -- y :: Fractional b => Foo [Char] b
let z = Biz True False      -- z :: Foo Bool Bool

レコードパラメータを持つカスタムデータ型

名字、年齢、電話番号、通り、郵便番号、町があるデータ型Personを作成するとします。

我々は書くことができる

data Person = Person String String Int Int String String String

今、電話番号を取得したい場合は、関数を作成する必要があります

getPhone :: Person -> Int
getPhone (Person _ _ _ phone _ _ _) = phone

まあ、これは楽しいことではありません。私たちはパラメータを使ってうまくいく:

data Person' = Person' { firstName     :: String
                       , lastName      :: String
                       , age           :: Int
                       , phone         :: Int
                       , street        :: String
                       , code          :: String
                       , town          :: String }

ここで、関数のphoneを取得します

:t phone
phone :: Person' -> Int

私たちは今、私たちが望むものを何でもすることができます:

printPhone :: Person' -> IO ()
printPhone = putStrLn . show . phone

パターンマッチングで電話番号をバインドすることもできます。

getPhone' :: Person' -> Int
getPhone' (Person {phone = p}) = p

パラメータを簡単に使用するには、 RecordWildCards



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow