2011-04-17 21 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