我需要接收一個串列 [Int] 并計算元素的值并回傳一個包含總和值的串列。但是如果總和值 > 9,則串列將是(示例)[5,6]。但如果不是 < 10,串列將是(示例)[0,9] 我已經完成并且不起作用
size_list :: [Int] -> Int
size_list [] = 0
size_list (x:xs) = x size_list xs
digitVerify :: [Int] -> [Int]
digitVerify [] = []
digitVerify l = if ((size_list l) > 9)
then
(div (size_list l) 10) : (mod (size_list l) 10)
else
0 : (size_list l)
uj5u.com熱心網友回復:
您快到了。
編譯有問題的代碼會引發以下錯誤,它們是同一事物的兩個實體:
fold.hs:9:48: error:
? Couldn't match expected type ‘[Int]’ with actual type ‘Int’
? In the second argument of ‘(:)’, namely ‘(mod (size_list l) 10)’
In the expression: (div (size_list l) 10) : (mod (size_list l) 10)
In the expression:
if ((size_list l) > 9) then
(div (size_list l) 10) : (mod (size_list l) 10)
else
0 : (size_list l)
|
9 | (div (size_list l) 10) : (mod (size_list l) 10)
| ^^^^^^^^^^^^^^^^^^^^
fold.hs:11:27: error:
? Couldn't match expected type ‘[Int]’ with actual type ‘Int’
? In the second argument of ‘(:)’, namely ‘(size_list l)’
In the expression: 0 : (size_list l)
In the expression:
if ((size_list l) > 9) then
(div (size_list l) 10) : (mod (size_list l) 10)
else
0 : (size_list l)
|
11 | 0 : (size_list l)
| ^^^^^^^^^^^
為什么是這樣?
以第一個示例為例,您正在呼叫運算子:來創建您的串列,并帶有兩個引數:div (size_list l) 10和mod (size_list l) 10。(:實際上是建構式的語法糖,而不是函式,但在這種情況下我們可以忽略這個區別。)
是什么型別的:?
一個 GHCi 會話告訴我們:
Prelude> :type (:)
(:) :: a -> [a] -> [a]
(:)采用型別的一個值a和一個串列的aS,并回傳串列as,這與預置到它的第一個引數的第二個引數。
因為您將 aInt作為第一個引數傳遞,所以 GHC 期望 a[Int]作為第二個引數,但您已經給了它 an Int,因此出現錯誤。
相反,要創建這樣的二元素串列,您有多種選擇:
使用串列文字語法:
[div (size_list l) 10, mod (size_list l) 10]結合使用
:運算子,但將空串列放在鏈的末尾:div (size_list l) 10 : mod (size_list l) 10 : []:關聯正確,所以這相當于div (size_list l) 10 : (mod (size_list l) 10 : [])這是有效的,如果你考慮一下。
連接單例串列:
[div (size_list l) 10] [mod (size_list l) 10]
然而,由于這個函式總是回傳一個二元素串列,它可能更適合回傳一個元組,即digitVerify應該有型別[Int] -> (Int, Int)。
我會讓你去探索那個選項,如果你卡住了,你可以回來問另一個問題。
哈斯克林快樂!
uj5u.com熱心網友回復:
:即使為空,的第二個引數也必須是一個串列[]。
錯誤0 : 3
[0,3]::0 : 3 : []
size_list :: [Int] -> Int
size_list [] = 0
size_list (x:xs) = x size_list xs
digitVerify :: [Int] -> [Int]
digitVerify [] = []
digitVerify l = if ((size_list l) > 9)
then
(div (size_list l) 10) : (mod (size_list l) 10) : []
else
0 : (size_list l) : []
測驗:
digitVerify [3]
digitVerify [50,6]
輸出:
[0,3]
[50,6]
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/374159.html
標籤:哈斯克尔
上一篇:圖中的可達節點
下一篇:如何在純函式中跳過不必要的IO?
