我想在列表中添加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
失败,模块加载:无。
答案 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的不同值的期望。