2010-12-17 72 views
1

嗨,我是Haskell的新手。 我正在嘗試做一個簡單的任務。幫助列表操作列表

test :: (RealFloat a) => a -> a -> [a] 
test xs ys= [ w : h: [] | w <- xs, h <- ys] 

我在這裏得到一個錯誤。 (沒有疑問) 在這個任務中,我只是試圖綁定兩個列表(例如:test [12.12] [14.14]) 並希望返回一個新的組合列表(例如:[12.12,14.14])

感謝您的幫助

+2

'[12.12] ++ [14.14] = [12.12,14.14]' – luqui 2010-12-17 17:59:21

+1

你究竟意味着什麼「綁定」? – mik01aj 2010-12-17 19:45:49

回答

1

您需要連接列表:

[12.12] ++ [14.14] 

=> [12.12,14.14] 
+0

這是錯誤的測試[1,2] [3,4] == [[1,3],[1,4],[2,3],[2,4]]不是[1,2 1,3,4]'。基於他的話可能是他想要的,但他的話不清楚,而代碼是精確的。 – 2010-12-17 18:08:43

+2

@TomMD:代碼(sand類型簽名)是精確的,並給出* *可能有效的結果,但他顯然是初學者,並不知道列表理解如何工作。另一方面,他的例子也很清楚,他確實說英語的時間比Haskell長;) – delnan 2010-12-17 18:53:13

3

您的簽名是錯誤的。嘗試:

test xs ys = ... 

然後在ghci的:

> :t test 
test :: [t] -> [t] -> [[t]] 

你需要兩個參數,都是列表,而不是兩個單獨的元件的參數。

+0

他期望連接兩個列表,而不是將它們組合成列表列表。你的簽名應該是test :: [t] - > [t] - > [t] – rtperson 2010-12-17 19:15:53

+2

如果他說連接,那麼毫無疑問,但術語'bind'對我來說是模棱兩可的。無論如何,我認爲他在運行提供的代碼時會出現類型錯誤 - 即使它不是他想要的代碼,也許他將通過學習GHCi中的類型簽名和「:t」來獲益。 – 2010-12-17 19:39:18

3

Drakosha是正確的。 List連接在Haskell中已經有了一個運算符。

test :: (RealFloat a) => [a] -> [a] -> [a] 
test xs ys= xs ++ ys 

你可能不希望在這裏使用列表理解,除非你想每一個元素在你的第一個和第二個列表提取和做他們的東西。例如,笛卡爾乘積:

list1 = [1.0,1.1,1.2] :: [Double] 
list2 = [2.0,2.1,2.2] :: [Double] 

testComps xs ys = [(x,y) | x <- xs, y <- ys] 

或添加:

testComps2 xs ys = [ x + y | x <- xs, y <- ys] 

甚至創建列表:

testComps3 xs ys = [x : y : [] | x <- xs, y <- ys] 

在GHCI,這將產生以下

*Main> testComps list1 list2 
[(1.0,2.0),(1.0,2.1),(1.0,2.2),(1.1,2.0),(1.1,2.1),(1.1,2.2),(1.2,2.0),(1.2,2.1) 
    ,(1.2,2.2)] 
*Main> testComps2 list1 list2 
[3.0,3.1,3.2,3.1,3.2,3.3000000000000003,3.2,3.3,3.4000000000000004] 
*Main> testComps3 list1 list2 
[[1.0,2.0],[1.0,2.1],[1.0,2.2],[1.1,2.0],[1.1,2.1],[1.1,2.2],[1.2,2.0],[1.2,2.1] 
    ,[1.2,2.2]] 

testCo中的奇怪結果當你處理浮點數時,mps2當然是正常的。在現實世界中,你會通過四捨五入來彌補這一點。

您遇到的另一個問題是(++)和(:)之間的差異。簡單地說,(:)將單個項目粘貼到列表上,而(++)連接兩個列表。