[英]Haskell Homework - Decimal List [Int] -> Int
分配是定義函數decimal :: [Int] -> Int
,其中一個正整數列表將給出十進制數 因此這個列表
[1,4,3,1,9]
是返回Integer
14319.我使用fold
功能。
我真的沒有從這里開始的好主意,所以我只需要朝着正確的方向推進,但我正在考慮霍納計划。 謝謝!
在折疊中,您從左側開始向右移動。 消耗列表中的下一個元素時,將您已有的元素乘以10,然后將新元素添加到該元素中。
因此,如果將折疊的種子設為0,並且具有[1,2,3],則函數會將電流(0)乘以10(也是0),然后加1。繼續,將電流(1)乘以10(得出得到10)並加2(12)。 然后最后為3,12 * 10 = 120,120 + 3 = 123。
那應該很容易編寫代碼:)
也許這個方程式將指導您。
由於這是一項家庭作業,因此我們不建議您將此表達式擴展為某些列表,並嘗試提取一個經常性關系:
x_0 * 10 ^ n + x_1 * 10 ^(n-1)+ ... + x_n * 10 ^ 0 =((((x_0 * 10 + x_1)* 10 + x_2)...)* 10 + x_n
如果將它與折疊比較,對於兩個參數的特定函數,將看到一個與該模式匹配的折疊。
這是我的變體
import Data.List
decimal :: [Int] -> Int
decimal xs = foldl' (\sum (pos,x) -> (sum + x*(10^(l-pos)))) 0 $ zip [1..] xs where
l = length xs
*Main> decimal [1,4,3,1,9]
14319
在Haskell
,您擁有真正強大的武器-列表處理功能。 這些功能之一是foldl
(我們用嚴格的版本foldl
, foldl'
)它的類型
foldl :: (a -> b -> a) -> a -> [b] -> a
該函數接受三個參數,一個累加的累積量,一個已處理的列表,以及最感興趣的是對累加器和list元素執行任何操作並返回結果的函數。 折疊功能確實很重要,因此您應該閱讀有關它的詳細手冊 。
但是,有一個問題,我們的方程式有三個變量:已處理列表元素( x
),總列表長度( n
)和已處理元素的位置( k
)。 但是我們只能遍歷foldl
元素。 我們如何遍歷每個元素的位置? 讓我們從Int
組成元組,其中第一個元素是位置,第二個是值。 這是一個標准技巧, zip
功能可幫助我們:
zip [1..] [1,4,3,4,6]
[(1,1),(2,4),(3,3),(4,4),(5,6)]
然后我們將元組列表傳遞給foldl
函數,然后foldl
為列表的每個元素調用lambda function
(\\sum (pos,x) -> (sum + x*(10^(l-pos))))
,將結果相加sum
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.