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)