如何创建一个列表,其中包含对 Haskell 中另一个列表的每个项目的计算?

问题描述

我正在尝试制作一个函数来计算(然后作为 String 输出)列表中两个元素之间的差异 - 第 1 个和第 2 个,然后是第 2 个和第 3 个,依此类推 - 我想我试一试,但我目前一直遇到错误 whack-a-mole,我把当前的错误放在下面,但首先,强制性的代码转储:

type Name = String
type Coordinates = (Int,Int)
type Pop = Int
type TotalPop = [Pop]
type City = (Name,(Coordinates,TotalPop))

testData :: [City]
testData = [("New York City",((1,1),[5,4,3,2])),("Washingotn DC",((3,3),[3,2,1,1])),("Los Angeles",((2,2),[7,7,5]))]

getPopGrowth :: [City] -> Name -> String
getPopGrowth cs name = concat
    [getPercentages z ++ "\n" | (x,z) <- maybeToList (lookup name cs)] where
    getPercentages z = unwords (map show z1) ++ "% " where
        z1 = percentageIncrease z

percentageIncrease :: [Int] -> [Float]
percentageIncrease (x:xs)
    | length (x:xs) > 2 = percentageIncrease (tail xs)
    | otherwise = (a / b - 1) * 100.0 where
        a = fromIntegral x :: Float
        b = fromIntegral (head xs) :: Float

我现在得到的错误是:

error:
    • Couldn't match expected type ‘[Float]’ with actual type ‘Float’
    • In the expression: (a / b - 1) * 100.0
      In an equation for ‘percentageIncrease’:
          percentageIncrease (x : xs)
            | length (x : xs) > 2 = percentageIncrease (tail xs)
            | otherwise = (a / b - 1) * 100.0
            where
                a = fromIntegral x :: Float
                b = fromIntegral (head xs) :: Float
   |
92 |     | otherwise = (a / b - 1) * 100.0 where
   |                   ^^^^^^^^^^^^^^^^^^^

我想强调,我理解错误,但我不知道如何解决它以获得所需的函数结果。 只是为了澄清我正在尝试做的事情。 输入:getPopGrowth testData "New York City" 应该输出:25% 33.333% 50%

解决方法

到目前为止,您只计算列表仅剩两个元素时的百分比。较少的元素没有被覆盖,对于较长的列表,在之前的所有步骤中,元素被删除而无需进一步操作。但是,在最后一步中,您返回的是一个 Float 而不是列表。

以下示例在每个步骤中创建一个增加百分比,将其与将函数应用于列表尾部所产生的列表连接起来。此外,所有基本情况都已涵盖:

percentageIncrease :: [Int] -> [Float]
percentageIncrease [] = []
percentageIncrease (x:[]) = []
percentageIncrease (x:y:xs) = ((a / b - 1) * 100.0) : percentageIncrease (y:xs) where
                                a = fromIntegral x :: Float
                                b = fromIntegral y :: Float

控制台输出:

*Main> getPopGrowth testData "New York City"
"25.0 33.333336 50.0% \n"

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...