2009-05-18 21 views

回答

6

下面的代碼將做的工作:

map head [[1,2,3],[4,5,6]] 

map是Haskell中最有用的功能(和其他功能的編程語言)之一。鑑於列表[a,b,c,d]和函數f,map f [a,b,c,d]將返回列表[f a, f b, f c, f d]head函數提取列表的第一個元素。這就是爲什麼

map head [[1,2,3],[4,5,6]] -> 
[head [1,2,3], head [4,5,6]] -> 
[1,4] 
6

更一般:

col :: Int -> [[a]] -> [a] 
col n = map (head . drop n) 

請記住,如果n大於或等於任何你給它的列表的長度,這將失敗。

+5

等價地,`col n = map(!! n)`,我認爲這個意圖更清楚一點。因人而異。 – ephemient 2009-05-18 14:16:42

1

下面的代碼將做的工作:

map head [[1,2,3],[4,5,6]] 

要擴大喬納斯的回答; map將函數應用於列表的每個元素。在列表上「映射」一個函數的結果是一個不同類型的新列表。

您在此處輸入的列表的類型爲[[Int]],這意味着列表中的每個元素都是Int s的列表。所以你需要一個函數來獲取每個子列表並返回它的第一個元素;那是head

綜上所述,map將採取功能head,將其應用到每個子列表中,這樣你就會獲得一個包含每個列表的只是頭(第一個元素)類型[Int]的新列表。

2

將行矩陣轉換爲列矩陣的庫函數爲Data.List.transpose。因此,要解決你的問題的一個方法是

import Data.List (transpose) 
col = head . transpose 

你也可以寫一個函數來獲取從矩陣的任何列:

colN n matrix = transpose matrix !! n 

免責聲明:

記住,轉置是昂貴的,如果你需要轉置整個矩陣。就第一列而言,應該與人們提供的其他解決方案的成本相同。

此外,轉置在複雜的代碼中相對危險,因爲其結果與其參數的結果類型相同:[[a]] -> [[a]]。所以很容易引入錯誤的轉置次數。 (我很難學到這一點)。