Вопрос по haskell – Доступ к членам пользовательского типа данных в Haskell

31

Скажем, у меня есть следующий пользовательский тип данных и функция в Haskell:

data Person = Person { first_name :: String, 
                       last_name :: String,
                       age :: Int 
                     } deriving (Eq, Ord, Show)

Если я хочу создать функциюprint_age напечатать возраст человека, например, так:print_age (Person "John" "Smith" 21) как бы я написалprint_age получить доступ к параметру возраста? Я - объектно-ориентированный парень, поэтому я не в себе. Я в основном ищу эквивалент Person.age.

Ваш Ответ

3   ответа
6

age Функция упоминается в других ответах, иногда удобно использовать сопоставление с образцом.

print_age Person { age = a } = {- the a variable contains the person's age -}

Существует довольно безобидное расширение, которое позволяет пропустить бит именования:

{-# LANGUAGE NamedFieldPuns #-}
print_age Person { age } = {- the age variable contains the person's age -}

... и другой, рассматриваемый с разной степенью недоверия различными членами сообщества, который позволяет вам даже не упоминать, какие поля вы хотите включить в область:

{-# LANGUAGE RecordWildCards #-}
print_age Person { .. } = {- first_name, last_name, and age are all defined -}
17

У Ляха есть хороший раздел (Ctrl-F для «Синтаксис записи»).

Когда тип данных определен с записями, Haskell автоматически определяет функции с тем же именем, что и у записи, чтобы действовать как средства доступа, поэтому в этом случаеage является аксессором поля возраста (имеет типPerson -> Int) и аналогично дляfirst_name а такжеlast_name.

Это нормальные функции Haskell и поэтому называются какage person или жеfirst_name person.

Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededPerson.age personError: User Rate Limit Exceededperson.ageError: User Rate Limit Exceeded
Error: User Rate Limit Exceededghc.haskell.org/trac/ghc/wiki/Records/NameSpacing
47

age person будет соответствоватьperson.age() распространено в ООП языках.print_age функция может быть определена безочередно по составу функции

print_age = print . age

или полный

print_age person = print (age person)

Похожие вопросы