List 求Haskell列表中偶数的平方和

List 求Haskell列表中偶数的平方和,list,dictionary,haskell,filter,List,Dictionary,Haskell,Filter,我想总结一下​​列表中偶数的平方。我尝试了这个,但显示了一个错误 sumaDeCuadrados :: [Int] -> Int sumaDeCuadrados (x:xs) = sumaListAux (map f l) 0 where l = filter even (x:xs) f = x * x sumaDeCuadrados _ = 0 sumaListAux是一个函数,定义为 sumaListAux :: [Int] -> Int -&g

我想总结一下​​列表中偶数的平方。我尝试了这个,但显示了一个错误

sumaDeCuadrados :: [Int] -> Int
sumaDeCuadrados (x:xs) = sumaListAux (map f l) 0 
    where l = filter even (x:xs) 
          f = x * x
sumaDeCuadrados _ = 0
sumaListAux是一个函数,定义为

sumaListAux :: [Int] -> Int -> Int
sumaListAux [] r = r
sumaListAux (x:xs) r = x + sumaListAux xs r
实际的问题是,map期望第一个参数是一个函数,它接受一个整数并返回一个整数,但是您要传递一个整数。这就是为什么您会收到这样的错误消息

main = print $ sumaDeCuadrados [1, 2, 3, 4, 5]
-- 20
无法将预期类型'Int->Int'与实际类型'Int'匹配 在'map'的第一个参数中,即'f' 在'sumaListAux'的第一个参数中,即'map f l' 在表达式中:sumaListAux映射f l 0 所以,您需要将f定义为一个单独的函数,以便map可以将该函数应用于l。我建议使用适当的名称来命名函数,比如squarer

然后你可以这样称呼它

main = print $ sumaDeCuadrados [1, 2, 3, 4, 5]
-- 20
总数​​列表中偶数的平方

Haskell在某些方面是一种声明性语言,因此您可以声明这些内容的含义

-- declare a list
> let list = [1..10]

-- declare what the even elements of a lsit are
> let evens xs = filter even xs

-- declare what the squares of a list are
> let squares xs = map (^2) xs
总和已经存在了,总和。那么现在你的句子是:

 sum ​​the squares of the even numbers
可转换为:

> sum . squares . evens $ list
220

基于以上答案,完全可以使用高阶函数来实现这一点

sumEvenSquares :: (Num a) => [a] -> a
sumEvenSquares xs = sum(map(^2)(filter even xs))

在本例中,您可以使用偶数谓词筛选列表,并将函数^2映射到该列表上。从这个返回的列表中,您可以对其进行求和。

在不公布详细信息的情况下,切勿声明问题中存在错误。这是一个信息丰富的回答,只说明有一个修复。用fx=x*x替换f=x*x,它就会工作。第一个方程定义一个数字,第二个方程定义一个函数。