地图和过滤器,Haskell

时间:2015-12-17 20:52:38

标签: haskell

您好我想知道如何使用haskell中的/wwwroot/jsmap函数来获取列表中的数字量,这令人感到困惑,这是一个例子。

filter

我希望使用let a = [[1,2,1,2,1,1,1],[1,2],[3,4],[3,2]] 找出每个子列表中有多少map,结果将是

1s

任何想法如何做,我猜它很容易,我只是缺少一些东西,欢呼,我的方法是

[5,1,0,0]

但这是错误

3 个答案:

答案 0 :(得分:3)

首先获得过滤功能:

 ((==) 1)

这将从列表中过滤除1之外的所有其他元素:

 filter ((==) 1)

然后通过函数组合将它与长度函数结合起来:

 (length . filter ((==) 1))

最后,使用该功能映射列表数组,您已完成!

 map (length . filter ((==) 1))

答案 1 :(得分:1)

将问题分解为小步骤。

步骤1.计算列表中的1的数量。使用count1s :: [Int] -> Intlength创建一个函数filter

步骤2.使用mapcount1s应用于外部列表中的每个列表。

答案 2 :(得分:0)

您写道:

let ones = map(\x length (filter (\z -> z == 1)x) )a

非常好的尝试,几乎正确!让我们把它粘贴到GHCi中,它会回吐:

<interactive>:9:35: Parse error in pattern: \ z -> z == 1

那是什么意思?这意味着它认为它正在查看模式并且它无法读取它(解析其文本)。如果我们只看那件事,它就不是一种模式!为什么它认为它在看模式?

由于较早的\x没有->。在函数文字的参数中,您可以进行模式匹配!你可以写\(y:_) x -> y + x,它与(+) . head相同,取一个列表的头部并将其添加到提供的第二个数字。

插入它我们得到:

let ones = map(\x -> length (filter (\z -> z == 1)x) )a

这会产生进一步的错误:

<interactive>:10:55: Not in scope: ‘a’

这是因为我忘了明确定义a,因此很容易修复:

let ones a = map(\x -> length (filter (\z -> z == 1)x) )a

编译,然后:

Prelude> ones [[1,2,1,2,1,1,1],[1,2],[3,4],[3,2]]
[5,1,0,0]

根据需要。但我们尚未完成,请简化!

首先,\z -> z == 1使用operator sections作为(1 ==)更容易编写。我建议总是把它放在那个空间里,这样看起来有些额外的不完整&#34;。

然后\x -> length (filter (1 ==) x)也有点罗嗦,我们可以使用function composition operator .将其写为length . filter (1 ==)。如果你对这里的优先级感到困惑,请记住括号总是首先发生,然后是函数,然后是运算符...所以如果你真的把它写出来的话,那就是(.) length (filter (1 ==))

完成后,在源文件中为其指定名称和类型签名!

countOnes :: (Eq a, Num a) => [a] -> Int
countOnes = length . filter (1 ==)

然后,只要您实际使用此代码,我就会写map countOnes