簡體   English   中英

在 Haskell 中訪問自定義數據類型的成員

[英]Accessing members of a custom data type in Haskell

假設我在 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 的東西。

函數 application 是前綴,所以age person將對應於 OOP 語言中常見的person.age() print_age函數可以通過函數組合來定義 pointfree

print_age = print . age

或點滿

print_age person = print (age person)

這稱為記錄語法, LYAH 有一個很好的部分

當使用記錄定義數據類型時,Haskell 會自動定義與記錄同名的函數作為訪問器,因此在這種情況下age是年齡字段的訪問器(它的類型為Person -> Int ),對於first_name也類似和last_name

這些是正常的 Haskell 函數,因此被稱為age personfirst_name person

除了其他答案中提到的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 -}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM