如何在列表中使用if then else语句的过滤器?

时间:2011-04-17 08:36:31

标签: parsing haskell

我想在列表中添加1个项目,其中只有一个项目并添加项目(在使用toInt转换为整数之后)如果项目数大于1且最后项目相同

怎么办?

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

失败,模块加载:无。

2 个答案:

答案 0 :(得分:3)

您对u的定义显然很糟糕。如果你提供类型签名会有所帮助,所以我们会更好地理解你要做的事情(即使你没有用语言告诉我们)。

您评论说您想要所有长度列表> 1,这与删除第一个元素后获取所有非空列表相同。所以使用filter,它分别测试每个元素(所以你不需要map),并构建一个函数来测试单个列表的长度> 1或它的null子列表:

-- 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 :(得分:1)

编译器告诉你map length y > 1是一个布尔值,但是filter想要一个函数。我不确定你真正想要用y做什么,请说明你对y的不同值的期望。