1

我真的需要帮助找到一种计算米兰达语言平均值的方法。我似乎得到了这个错误,它无法将类型 [num] -> num 与 num 统一起来。我似乎无法将列表的总和作为一个值并进行除法?

elements = 4        
grades = [24, 12, 33, 17]

|| The code belows purpose is to get the sum of the list
ngrades == [num]
sumlist :: ngrades -> num
sumlist [] = 0
sumlist (front : rest) = front + sumlist rest

|| We calculate the average by getting the sum we calc above to the elements
avg = sumlist div elements

|| We compare each element reccursively to find the maximum value
maxi :: ngrades -> num
maxi [] = 0
maxi (front : []) = front[][1]
maxi (front : next : rest) = maxi (front : rest), if front > next
         = maxi (next : rest), otherwise
|| We compare each element reccursively to find the minimum value        
mini :: ngrades -> num
mini [] = 0
mini (front : []) = front
mini (front : next : rest) = mini (front : rest), if front < next
         = mini (next : rest), otherwise


 [1]: https://i.stack.imgur.com/2pYCq.jpg
4

1 回答 1

-1

Miranda 有一个标准库函数列表。对于您的问题,以下两个是有趣的:

总结数字列表的所有元素:

    sum :: [num] -> num

计算任何列表的所有元素:

    (#) :: [*] -> num

您可以简单地编写一个函数来计算平均值:

    average :: [num] -> num
    average [] = error "** Oops! **"
    average xs = sum xs / #xs

第一个模式捕获空列表。第二种模式计算总和和计数,然后将两者除以浮点数。

我习惯将列表命名为“xs”。

使用示例:

    grades = [24, 12, 33, 17]
    result = average grades

这个简单的解决方案适用于每个有限列表。如果列表真的很长,你扫描它两次(一次得到总和,第二次计算元素)。这可以简化为单次扫描。

顺便说一句:如果您更改,您的代码将起作用:

    avg = sumlist div elements

进入:

    avg = sumlist grades / elements
于 2021-08-27T00:03:08.723 回答