我是Haskell的新手,目前正在學習串列。
我有一個標記的串列
[("Tom"/span>, 87, 78, 67), ("Dick", 56, 45, 72) ]
而且我需要得到分數的總和和它的平均數。這是我的方法。
創建一個函式來計算每個考生的分數之和串列
sumOfMarks=((a, b, c, d) -> b c d)
并將該函式映射到原始串列中
newList = map sumOfMarks [("Tom"/span>, 87, 78, 67), ("Dick"/span>, 56, 45, 72)]
創建一個函式來計算每個考生的平均分數串列
avgList = map (`div`3) newList
合并所有的原始串列,newList和avgList
期望的輸出是
finalList = [("Tom"/span>, 87, 78, 67, 232, 77. 34), ("Dick", 56, 45, 72, 173, 57. 67)]
另一個問題是--這是否是解決問題的最佳方法,是否有更好的方法?
uj5u.com熱心網友回復:
你可以做一個函式,將4元組映射到5元組,所以這個函式看起來像:
map((n, a, b, c)-> (n, a, b, c, ...))oldList
在這里我留下...作為練習。
注意,div :: Integral a => a -> a -> a是整數除法。如果你需要處理浮點數,你可以使用(/) :: 小數a => a -> a -> a。為了將Integral數轉換成Fractional數,你可以利用fromIntegral :: (Integral a, Num b) => a -> b函式。
uj5u.com熱心網友回復:
(省去了使用/而不是div的必要轉換)
我們可以使用zipWith3組合這三個串列,或者使用zip3的串列理解,
finalList =
= zipWith3 ( (n,a,b,c) s avg -> (n,a,b,c,s, avg))
串列 newList avgList
= [ (n,a,b,c,s,avg) | ((n,a,b,c), (s, avg)) <-
壓縮串列
(zip newList
avgList) ]
= [ (n,a,b,c,s,avg) | ((n,a,b,c), s, avg) <-
zip3串列
(map sumOfMarks list)
(map (`div` 3) (map sumOfMarks list) ]
= [ (n,a,b,c,s,avg) | ((n,a,b,c), s, avg) <-
zip3串列
(map sumOfMarks list)
(map ((`div` 3) . sumOfMarks) list) ]
= [ (n,a,b,c,a b c,(a b c)/3)
| (n,a,b,c) <- list ] 。
= [ (n,a,b,c,s,avg)
| (n,a,b,c) <- list
, let s = a b c
, let avg = s/3 ]
與maps、zips、zipWiths等的各種組合相比,串列理解通常在視覺上更明顯(即更容易使用)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/316978.html
標籤:
下一篇:如何使用C讀取影像
