2011-04-17 19 views
0

我想添加1個項目到只有一個項目和添加項目(使用toInt轉換爲整數後)列表中y如果項目數量大於1和最後項目是相同的如何在列表中使用像if then else語句那樣的過濾器?

怎麼辦?

import Data.List.Split 

z = splitOn "+" "x^2+2*x^3+x^2" 

y = map (splitOn "*") z 

x = map head y 

toInt :: [String] -> [Int] 
toInt = map read 

u = filter ((map length y)>1) y 

Couldn't match expected type `a0 -> Bool' with actual type `Bool' 
In the first argument of `filter', namely `((map length y) > 1)' 
In the expression: filter ((map length y) > 1) y 
In an equation for `u': u = filter ((map length y) > 1) y 

失敗,已加載模塊:無。

回答

3

您對u的定義顯然是不好的。如果你給出類型簽名,它會有所幫助,所以我們更好地理解你正在嘗試做什麼(即使你不用言語告訴我們)。

您評論說您想要所有長度大於1的列表,這與刪除第一個元素後獲取所有非空列表相同。因此,使用過濾器,測試每個元素分別(所以你不需要map),並建立一個功能,要麼測試的長度的單一列表> 1或者它是空的子表:

-- Use the O(n) length for your filter 
u = filter ((> 1) . length) y 

-- Or use an O(1) drop + null test 
u' = filter (not . null . drop 1) y 

不使用功能組成(.)這些功能是:

u = filter (\sublist -> length (sublist) > 1) y 

u' = filter (\sublist -> not (null (drop 1 sublist))) y 
1

編譯器告訴你map length y > 1是一個布爾值,但filter需要一個函數。我不確定你真的想對y做什麼,請說明你對y的不同值的期望。

+0

我希望選擇列表哪個長度大於1 – Jo0o0 2011-04-17 14:36:21