List 更改[列表]

List 更改[列表],list,List,好的,我需要更新列表中的数据,在列表的前面添加一个新的数字,并删除最旧的数字: type Place = (String, Float, Float, [Int]) testData :: [Place] testData = [("London", 51.5, -0.1, [0,0,5,8,8,0,0]), ("Cardiff", 51.5, -3.2, [12,8,15,0,0,0,2]), ("Norwich", 52.6, 1.3, [0,6,5,0

好的,我需要更新列表中的数据,在列表的前面添加一个新的数字,并删除最旧的数字:

type Place = (String, Float, Float, [Int])

testData :: [Place]
testData = [("London", 51.5, -0.1, [0,0,5,8,8,0,0]), 
        ("Cardiff", 51.5, -3.2, [12,8,15,0,0,0,2]), 
        ("Norwich", 52.6, 1.3, [0,6,5,0,0,0,3]), 
        ("Birmingham", 52.5, -1.9, [0,2,10,7,8,2,2]), 
        ("Liverpool", 53.4, -3.0, [8,16,20,3,4,9,2]), 
        ("Hull", 53.8, -0.3, [0,6,5,0,0,0,4]),
        ("Newcastle", 55.0, -1.6, [0,0,8,3,6,7,5]), 
        ("Belfast", 54.6, -5.9, [10,18,14,0,6,5,2]), 
        ("Glasgow", 55.9, -4.3, [7,5,3,0,6,5,0]), 
        ("Plymouth", 50.4, -4.1, [4,9,0,0,0,6,5]),
        ("Aberdeen", 57.1, -2.1, [0,0,6,5,8,2,0]), 
        ("Stornoway", 58.2, -6.4, [15,6,15,0,0,4,2]),
        ("Lerwick", 60.2, -1.1, [8,10,5,5,0,0,3]), 
        ("St Helier", 49.2, -2.1, [0,0,0,0,6,10,0])]
我尝试了下面的函数

     updateRain :: Int -> Place -> Place
     updateRain x info = [info|(city,long,lat,rain)<- info, rain == newRain]
       where newRain = x : init rain

demo = zipWith updateRain [0,8,0,0,5,0,0,3,4,2,0,8,0,0] testData
当我尝试加载此文件时,出现以下错误:

     Couldn't match type ‘[Place]’
                 with ‘(String, Float, Float, [Int])’
  Expected type: Place
    Actual type: [Place]
• In the expression:
    [info | (city, long, lat, rain) <- info, rain == newRain]
  In an equation for ‘updateRain’:
      updateRain x info
        = [info | (city, long, lat, rain) <- info, rain == newRain]
        where
            newRain = x : init rain
   |
43 | updateRain x info = [info|(city,long,lat,rain)<- info, rain == newRain]

有人知道我哪里出错了吗?我希望接收的参数是新数据,testData和输出是testData,rain将更新为每个列表中的新数字,并删除每个列表中的最后一个数字。

updateRain函数使用列表理解,这意味着…updateRain x info中的信息=[info | city,long,lat,rainHi,那么去掉方括号可以解决这个问题吗?我想能够向函数表示,当调用最后一个函数时,rain需要是testData中列表中的newRain。方括号是列表理解,这意味着这里的信息应该是一个列表。但是只要去掉方括号就可以了我没有解决这个问题。谢谢!我必须添加demo::Int->IO,但是当我在demo之前添加它来调用它并加载它时,会输出这个错误:无法将预期的类型“IO”与实际的类型“[Place]”匹配,但是我以前尝试过使用zipWith打印,但它似乎不起作用。spacefruiticle:您是否使用updateRain编写了print zipWith[0,8,0,0,0,5,0,0,0,3,4,2,0,8,0,0]测试数据?所以用括号?啊,不,我没有犯愚蠢的错误,我完全错过了这一点,谢谢你的帮助,现在可以了!@spacefruiticle:你不必再添加另一个case,也可以从末尾删除,这自然会处理空列表:dropEnd n xs=zipWith const xs drop n xs,然后dropEnd 1 rain
updateRain :: Int -> Place -> Place
updateRain x (city,long,lat,rain) = (city, long, lat, x : init rain)
updateRain :: Int -> Place -> Place
updateRain x (city,long,lat,[]) = …
updateRain x (city,long,lat,rain@(_:_)) = (city, long, lat, x : init rain)