2

又是我 :)

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

在这个例子中,我试图搜索我的整数列表列表来寻找第一名。我希望它总计找到第一名的次数。在下面的示例中,结果将为 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

4 回答 4

8

展平您的列表并将其简化为您已经知道如何解决的问题。从根本上说,您正在浏览列表列表这一事实并不会改变您的答案:您只关心1结构中 s 的数量。

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

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

于 2013-10-05T00:01:11.647 回答
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
于 2013-10-05T07:11:33.603 回答
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 方法将您的列表展平, filter 为列表中的每个项目评估一个 func 并丢弃任何返回 false 的项目,而 length 只计算剩余的元素。

于 2013-10-05T00:11:00.160 回答
0

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

getOne :: [[Int]] -> Int
getOne = foldl (\ b a -> if a == 1 then b+1 else b) 0 . concat
于 2013-10-05T00:24:29.600 回答