Haskell Language
Создание пользовательских типов данных
Поиск…
Создание простого типа данных
Самый простой способ создать пользовательский тип данных в Haskell - использовать ключевое слово data
:
data Foo = Bar | Biz
Имя типа указывается между data
и =
и называется конструктором типа . После =
мы указываем все конструкторы значений нашего типа данных, разделенные символом |
знак. В Haskell существует правило, что все конструкторы типов и значений должны начинаться с заглавной буквы. Вышеуказанное заявление можно читать следующим образом:
Определите тип, называемый
Foo
, который имеет два возможных значения:Bar
иBiz
.
Создание переменных нашего пользовательского типа
let x = Bar
Вышеприведенный оператор создает переменную с именем x
типа Foo
. Давайте проверим это, проверив его тип.
:t x
печать
x :: Foo
Создание типа данных с параметрами конструктора значения
Конструкторы значений - это функции, возвращающие значение типа данных. Из-за этого, как и любая другая функция, они могут принимать один или несколько параметров:
data Foo = Bar String Int | Biz String
Давайте проверим тип конструктора значений Bar
.
:t Bar
печать
Bar :: String -> Int -> Foo
что доказывает, что Bar
действительно является функцией.
Создание переменных нашего пользовательского типа
let x = Bar "Hello" 10
let y = Biz "Goodbye"
Создание типа данных с параметрами типа
Конструкторы типов могут принимать один или несколько параметров типа:
data Foo a b = Bar a b | Biz a b
Параметры типа в Haskell должны начинаться с строчной буквы. Наш пользовательский тип данных еще не является реальным типом. Чтобы создать значения нашего типа, мы должны подставить все параметры типа с фактическими типами. Поскольку a
и b
могут быть любого типа, наши конструкторы значений являются полиморфными функциями.
Создание переменных нашего пользовательского типа
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