basic haskell:如何搜索int的列表列表

时间:2013-10-04 23:53:33

标签: haskell

我又来了:)

正如我在标题中所说,我正在寻找一种方法来搜索特定int的列表(of int)列表。 这是一个更大问题的一部分,但我已经简化了它,以便在这种情况下更容易解释。

在这个例子中,我试图搜索我的整体列表列表以寻找第一名。我希望它总计找到第一的次数。在下面的例子中,结果将是3。

这是我到目前为止所拥有的:

a = [1,2,3]
b = [1,17,12]
c= [201,16,1]
d = [234,235,123]

y =[a,b,c,d]

getOne :: [[Int]]->Int
getOne List' = total
    where 
        checkNumber x = x==1
            checkList = filter CheckNumber List'
            total = sum checkList

我知道我不能这样做因为我无法检查List是否等于1但是如何查看列表中的列表

4 个答案:

答案 0 :(得分:8)

展平您的列表列表并将其减少到您已经知道如何解决的问题。从根本上说,您通过列表列表这一事实并没有改变您的答案:您只关心结构中1的数量。

您可以使用hoogle找到展平列表的功能。只需输入这样的函数类型,它就会得到结果。它是学习Haskell API的一个非常有用的工具,所以现在是开始使用它的好时机。

使用递归自己实现展平函数也许是个好主意。这样做还可以让您深入了解如何直接编写getOne函数。这是一个很好的学习练习。

答案 1 :(得分:1)

如果没有展平,你可以试试:

Prelude> let y = [[1,1,2] , [4], [5,6,1]]
Prelude> sum [length $ filter (==1) yl | yl <- y]
3

或使用Applicative

Prelude> import Control.Applicative
Prelude Control.Applicative> sum $ length <$> filter (==1) <$> y

答案 2 :(得分:0)

我编写了几个类似的函数来计算最大化问题。这对您的项目有何影响?

a = [1,2,3]
b = [1,17,12]
c= [201,16,1]
d = [234,235,123]

y =[a,b,c,d]
getOne :: [[Int]] -> Int
getOne = length . filter (== 1) . concat

请注意,concat方法会使列表变平,过滤器会为列表中的每个项目计算func并丢弃任何返回false的值,而length只计算其余元素。

答案 3 :(得分:0)

这是左侧折叠选项。这更有效(迭代每个元素一次)并且无需导入。

getOne :: [[Int]] -> Int
getOne = foldl (\ b a -> if a == 1 then b+1 else b) 0 . concat