您好我想知道如何使用haskell中的/wwwroot/js
和map
函数来获取列表中的数字量,这令人感到困惑,这是一个例子。
filter
我希望使用let a = [[1,2,1,2,1,1,1],[1,2],[3,4],[3,2]]
找出每个子列表中有多少map
,结果将是
1s
任何想法如何做,我猜它很容易,我只是缺少一些东西,欢呼,我的方法是
[5,1,0,0]
但这是错误
答案 0 :(得分:3)
首先获得过滤功能:
((==) 1)
这将从列表中过滤除1之外的所有其他元素:
filter ((==) 1)
然后通过函数组合将它与长度函数结合起来:
(length . filter ((==) 1))
最后,使用该功能映射列表数组,您已完成!
map (length . filter ((==) 1))
答案 1 :(得分:1)
将问题分解为小步骤。
步骤1.计算列表中的1的数量。使用count1s :: [Int] -> Int
和length
创建一个函数filter
。
步骤2.使用map
将count1s
应用于外部列表中的每个列表。
答案 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
。