Поиск…


Создание простого типа данных

Самый простой способ создать пользовательский тип данных в 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



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow