Haskell 程式:從一個建構函式呼叫另一個建構函式
在 Haskell 中,我們可以使用使用者定義的函式從一個建構函式呼叫另一個建構函式。在第一個示例中,我們將使用 (newPerson name = Person name 10) 建構函式,在第二個示例中,我們將使用 (newPerson n a = Person { name = n, age = a }) 建構函式。在第三個示例中,我們將使用 (clonePerson p = p { name = name p ++ " clone" }) 建構函式,在第四個示例中,我們將使用 (clonePerson p = p { name = name p ++ " clone" }) 建構函式。
方法 1:使用使用者定義的函式從一個建構函式呼叫另一個建構函式
在這種方法中,我們定義了一個數據型別 Person,它有兩個欄位,一個名稱 (String) 和一個年齡 (Int)。然後,我們定義一個新的建構函式 newPerson,它接受一個名稱並建立一個具有該年齡的新 Person 物件。我們還定義了一個 printPerson 函式,它接受一個 Person 物件並列印其名稱和年齡。
演算法
步驟 1 − 定義資料型別 ‘Person’,它有兩個欄位:name 和 age。
步驟 2 − 定義建構函式來建立一個新的 Person 物件,如下所示:
步驟 3 − 定義 printPerson 函式,如下所示:
步驟 4 − 程式執行將從 main 函式開始。main() 函式控制整個程式。它被寫成 main = do。
步驟 5 − 定義名為 ‘p1’ 和 ‘p2’ 的變數,它們將呼叫 ‘Person’ 物件,並列印其詳細資訊。當一個建構函式呼叫另一個建構函式時,就會發生這種情況。
newPerson name = Person name 10.
printPerson (Person name age) = putStrLn $ name ++ " is " ++ show age ++ " years old".
示例 1
在此示例中,一個建構函式透過使用使用者定義的函式從另一個建構函式中被呼叫。
data Person = Person String Int newPerson :: String -> Person newPerson name = Person name 10 printPerson :: Person -> IO () printPerson (Person name age) = putStrLn $ name ++ " is " ++ show age ++ " years old" main :: IO () main = do let p1 = Person "John" 30 p2 = newPerson "Jane" printPerson p1 printPerson p2
輸出
[1 of 1] Compiling Main ( main.hs, main.o ) Linking main ... John is 30 years old Jane is 10 years old
示例 2
在此示例中,定義了一個具有兩個欄位 name 和 age 的 Person 資料型別。它還定義了兩個函式 newPerson 和 clonePerson,分別用於建立具有給定名稱和年齡的新 Person,以及建立給定 Person 的克隆,並在其名稱後附加 " clone"。
data Person = Person { name :: String, age :: Int } deriving (Show) newPerson :: String -> Int -> Person newPerson n a = Person { name = n, age = a } clonePerson :: Person -> Person clonePerson (Person n a) = Person { name = n ++ " clone", age = a } main :: IO () main = do let person1 = newPerson "Alice" 25 person2 = clonePerson person1 putStrLn $ "Person 1: " ++ show person1 putStrLn $ "Person 2: " ++ show person2
輸出
[1 of 1] Compiling Main ( main.hs, main.o ) Linking main ... Person 1: Person {name = "Alice", age = 25} Person 2: Person {name = "Alice clone", age = 25}
示例 3
在此示例中,我們使用記錄語法定義了 clonePerson 函式,以根據給定的 Person 物件 p 建立一個新的 Person 物件。我們只需複製 age 欄位並將字串 " clone" 附加到 name 欄位。
data Person = Person { name :: String, age :: Int } deriving (Show) newPerson :: String -> Int -> Person newPerson n a = Person { name = n, age = a } clonePerson :: Person -> Person clonePerson p = p { name = name p ++ " clone" } main :: IO () main = do let person1 = newPerson "Alice" 25 person2 = clonePerson person1 putStrLn $ "Person 1: " ++ show person1 putStrLn $ "Person 2: " ++ show person2
輸出
[1 of 1] Compiling Main ( main.hs, main.o ) Linking main ... Person 1: Person {name = "Alice", age = 25} Person 2: Person {name = "Alice clone", age = 25}
示例 4
在此示例中,我們使用記錄語法定義了 Person 資料型別和一個函式 clonePerson,該函式接受一個 Person 並返回一個具有相同屬性但名稱字尾為 " clone" 的新 Person。
data Person = Person { name :: String, age :: Int } deriving (Show) clonePerson :: Person -> Person clonePerson p = p { name = name p ++ " clone" } main :: IO () main = do let person1 = Person { name = "Alice", age = 25 } person2 = clonePerson person1 putStrLn $ "Person 1: " ++ show person1 putStrLn $ "Person 2: " ++ show person2
輸出
[1 of 1] Compiling Main ( main.hs, main.o ) Linking main ... Person 1: Person {name = "Alice", age = 25} Person 2: Person {name = "Alice clone", age = 25}
結論
在 Haskell 中,資料型別可以有多個建構函式。一個建構函式可以透過使用與資料型別相同的名稱和模式匹配來呼叫另一個建構函式。這稱為記錄語法,其中建構函式可以具有與資料型別屬性相對應的命名欄位。