我有記錄的字母和數字(Lan),有一個字母欄位和一個數字欄位:
data Lan = Lan {letter :: String, number :: Int}
此外我有型別
type Lanlist = [Lan]
現在,我想寫一個函式,給定一個 Lanlist,如果所有元素都具有相同的數字,則回傳 True 。所以它會是這樣的:
equalNumber :: [Lan] -> Bool
問題是:我不知道如何簡單地訪問號碼記錄的相應欄位。我試過
equalNumber xs = map f xs
,我不知道 f 應該是什么(例如,只檢查數字欄位與前一個欄位的東西)。或者也許我可以使用和或過濾器功能。許多可能性,但它在記錄中的事實讓我感到困惑。有人可以幫忙嗎?
uj5u.com熱心網友回復:
您的問題的措辭方式強烈表明您只是缺乏有關如何處理記錄的知識。
給定的
data Lan = Lan {letter :: String, number :: Int} deriving Show -- (*)
(*) 我冒昧匯出了 Show,很方便
當您在 Haskell 中創建記錄時,它會為您提供建構式,在本例中為 Lan;以及訪問器,在本例中為letter和number。讓我們來看看它的實際效果:
λ> data Lan = Lan {letter :: String, number :: Int} deriving Show
-- construction. Two ways to do it.
λ> lan = Lan "A" 5
λ> lan' = Lan { letter = "B", number = 10 }
λ> lan
Lan {letter = "A", number = 5}
λ> lan'
Lan {letter = "B", number = 10}
-- The accessors
λ> letter lan
"A"
λ> letter lan'
"B"
λ> number lan
5
λ> number lan'
10
-- we can also patter match
λ> plus1 (Lan { number = n }) = n 1
-- ^ if it's a record we can name the fields in the pattern
-- Regular pattern matching
λ> plus1' (Lan _ n) = n 1
λ> plus1 lan
6
λ> plus1' lan
6
在 vanilla Haskell 中,這就是關于記錄的全部知識。
現在解決手頭的問題。我們有一個包含字母和數字的記錄,我們想確定一個 Lan 串列是否都具有相同的數字。顯然,我們可以丟棄字母。讓我們從這個開始:
λ> numbers xs = map number xs
λ> :t numbers
numbers :: [Lan] -> [Int]
λ> lans = [lan, lan']
λ> lans' = [Lan "Z" 15, Lan "X" 15]
λ> numbers lans
[5,10]
λ> numbers lans'
[15,15]
現在我們有了一個數字串列,我們可以弄清楚如何確定它們是否都相等。
λ> eqs xs = and $ zipWith (==) xs (tail xs)
λ> eqs (numbers lans')
True
λ> eqs (numbers lans)
False
綜上所述:
equalNumber :: [Lan] -> Bool
equalNumber = eqs . numbers
uj5u.com熱心網友回復:
無需在一個map. 您可以從簡單地將串列Lan轉換為純數字串列開始
map number xs
...這是確定財產是否持有所需要的全部內容。你可能想像這樣使用它:
equalNumber xs = case map number xs of
[] -> ...
(n:ns) -> ...
uj5u.com熱心網友回復:
要訪問記錄,您只需使用函式的名稱。
在這種情況下,它將是number. 所以有:
numbers xs = map number xs
將為您提供Lan物件內所有數字的串列。
理想情況下,我不會將所有內容都放在地圖中。以下是如何實施比較的示例。
equalNumber :: [Lan] -> Bool
equalNumber xs = and [x == y | (x, y) <- zip numbers (tail numbers)] where
numbers = map number xs
上面的代碼所做的是,它在Lan物件串列中創建一個數字串列,創建一個相鄰數字元組串列,并比較它們以確保它們都相等。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/331232.html
標籤:哈斯克尔
上一篇:用遞回判斷兩個串列的長度是否相同
