2011-10-06 77 views
1

我是一個新手,哈斯克爾,就死在一個簡單的問題:哈斯克爾 - 陣列

aaa :: [[(Char, Float)]] -> Float -> [[(Char, Float)]] 
aaa [[]] a = error "no indata" 
aaa [[(a,b)]] c = [[(a, b/c)]] 
aaa inD c = ?? 

如何使它在陣列超過1元的工作?

例:aaa [[('a',3)],[('b',4)],[('c',5)]] 4

結果:[[('a',0.75)],[('b',1)],[('c',1.25)]]

任何暗示PLS,THX!

回答

5

您可以在列表定義操作如下(我給你一個簡單的例子,增加了1到各列表項)

f [] = [] 
f (head:tail) = (head + 1):(f tail) 

head:tail代表一個列表;更具體地說,它代表第一個列表項目(head),如果我們將第一個項目帶走(tail),則代表剩餘列表。然後,你通常將你的東西用於head並使用tail進行遞歸調用。

完成你的榜樣(未經測試),這將產生:

aaa ([(a,b)]:tail) c = [(a, b/c)] : (aaa tail c)

一件事:你是在處理一個列表,並希望修改以特定的方式列表的每個元素(但每個元素都以相同的方式轉換)。對於這樣的場合,哈斯克爾提供其內在map函數,該函數:

  • 功能轉換列表中的項目
  • 作爲參數項目

的列表,並返回轉換列表。

+0

很好,thx 4的幫助。還有一個問題:如果我有這樣的輸入:aaa [[('a',3),('b',4),('c',5)],[('a',3),' b',4),('c',5)]] 4如何使這項工作? – Ferry

+0

@Ferry:您可能應該爲此提出一個新問題。 – phimuemue

+0

@Ferry:定義一個將[['','3','',')''(即單個子列表)作爲參數並對其進行變換的函數。然後,給這個函數作爲'map'的參數。 – phimuemue

3

首先,[...] stuff代表列表而不是陣列;這兩者之間有根本的區別。

試着按照fmap :: Functor a => (a -> b) -> f a -> f b來思考。該函數接受另一個函數並將其應用於數據結構。你可以用它來實現你的功能。這是一個簡單的實現。嘗試瞭解它:

aaa l c = fmap (fmap (fmap (/c))) l