對於任務,我被要求使用列表理解重新編寫以下函數。該函數獲取整數列表和一個整數數字a
,並返回列表中包含數字a
的整數數量。Haskell - 使用列表理解返回包含數字的整數數
例如
count [102,41,256] 2
應該返回2
count [98,4,376] 2
應該返回0
這是我對非列表解析功能:
split :: Int -> [Int]
split 0 = []
split x = split (div x 10) ++ [rem x 10]
checkDigits :: [Int] -> Int -> Int
checkDigits [] y = 0
checkDigits (x:xs) y
| x == y = 1 + (checkDigits xs y)
| otherwise = checkDigits xs y
count :: [Int] -> Int -> Int
count [] a = 0
count (x:xs) a
| (checkDigits (split x) a) > 0 = (checkDigits (split x) a) + (count xs a)
| otherwise = count xs a
拆分將在整數並返回列表中的整數
個split 321 will return: [3,2,1]
checkDigits
計數的時間,一個數字都顯示在一個整數(這是爲了解決一個錯誤的位置count [22] 2
將返回爲0
時,它應該返回2
)
e.g. the digit '2' appears 4 times in the list [2,65,42,22]
在數
最後數我們使用checkDigits
檢查x
中的任何數字是否等於a
,如果此數字大於0(1或更多等於a),則添加找到的數字位數並再次調用。
我是新來列出內涵和只設法得到它的工作,如果在列表中的數等於a
:
countD :: [Int] -> Int -> Int
countD intL a = length [y | y <- intL, y == a]
這裏countD [2,3,4,22] 2
回報1
升如何更改我有這麼它將返回3
(因爲列表中有3 2
)。
道歉我盡力解釋它。正確的方法是它應該計算實際數字在列表中出現的次數。例如 count [102,45,256,24] 2會返回3.這是因爲數字「2」在列表中出現了三次。 –
[更新]我實際上重新閱讀了簡要內容,並意識到我誤解了它所說的內容,並且您的第一點實際上是正確的。對此抱歉。你也可以解釋定義數字,數字和計數爲Int類型的好處嗎?你能不能只用count :: [Int] - > Int - > Int? –
是的,你是對的:你可以使用'[Int] - > Int - > Int'這也是爲什麼我在別名之上添加註釋' - 這些是可選的':)它們只是爲了可讀性, Int'不是很具描述性。在諸如Agda或Idris這樣的語言中,你會使用更多的約束(並因此描述)數據類型,而不僅僅是類型別名:返回類型將是'Nat',而'Digit'將會是'Fin 10'(這是上限爲10的'Nat');它甚至可以返回一個證明返回值是<= length xs'等:) –