我目前正在嘗試撰寫一個函式,該函式將 Int 和 Int 陣列作為引數,并且對于陣列中的每個偶數值,它將 Int 連接到最終陣列。所以,像這樣: f 3 [1,2,3,4,5,6] = [1,2,3,3,4,3,5,6,3]
這是我想象的可以作業的代碼(如果它不好,我剛開始很抱歉):
f :: Int -> [Int] -> [Int]
f(x,[]) = []
f(x,y)
|even head(y) = (head(y) [x] f(x,drop 1 y)
|otherwise = head(y) f(x,(drop 1 y))
我得到的錯誤是“無法將'Int'的預期型別與實際型別(a3,[[a3]])匹配'。我知道引數型別不匹配,但我不確定如何正確的語法看起來像這里
uj5u.com熱心網友回復:
您使用(x, []), 這意味著輸入型別將是一個元組,所以f :: (Int, [Int]) -> [Int].
我也會使用模式匹配而不是headand tail,所以:
f :: Int -> [Int] -> [Int]
f _ [] = []
f x (y:ys)
| even y = y : x : f x ys
| otherwise = y : f x ys
您還可以概括型別簽名,并使用內部函式來避免x每次都傳遞:
f :: Integral a => a -> [a] -> [a]
f x = go
where go [] = []
go (y:ys)
| even y = y : x : go ys
| otherwise = y : go ys
uj5u.com熱心網友回復:
另一種看待這個問題的方法是使用右折疊在偶數之后插入所需的元素。
f :: Int -> [Int] -> [Int]
f x lst = foldr (\y i -> if even y then y:x:i else y:i) [] lst
我們可以簡化為:
f :: Int -> [Int] -> [Int]
f x = foldr (\y i -> if even y then y:x:i else y:i) []
請注意,在不指定型別的情況下,更一般的推斷型別f是:
f :: (Foldable t, Integral a) => a -> t a -> [a]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/528519.html
標籤:哈斯克尔
上一篇:如何宣告一個引數可以是(Int,Int)或Maybe(Int,Int)的函式?
下一篇:使用三個串列的總和列印自定義字串
