-1

任何人都知道为什么这会导致错误Non-exhaustive patterns in function getCityPopulation

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, 7, 5]))]

getCityPopulation :: [City] -> Name -> Int -> Maybe (Coordinates, TotalPop)
getCityPopulation [] nameIn yearIn = error "Can't be empty"
getCityPopulation [cs] nameIn yearIn
    | nameIn == "" = error "Input City name"
    | yearIn == 0 || yearIn < 0 = error "invalid year"
    | otherwise = lookup nameIn [cs]

如您所见,我尝试添加一个案例,以说明任何参数可能为空或对于查找函数无效。还能是什么?

另外,我知道该yearIn变量目前是多余的,稍后将与预期的函数用途相关,即获取yearInTotalPop 列表的元素。

提前感谢您提供的任何和所有帮助:)

4

1 回答 1

4

[cs]这意味着一个 城市(列表项)的列表绑定到cs- 我认为你想要这个 - 所以没有超过零或一个元素的列表 - 错误告诉你。

getCityPopulation :: [City] -> Name -> Int -> Maybe (Coordinates, TotalPop)
getCityPopulation [] nameIn yearIn = error "Can't be empty"
getCityPopulation cs nameIn yearIn
    | nameIn == "" = error "Input City name"
    | yearIn == 0 || yearIn < 0 = error "invalid year"
    | otherwise = lookup nameIn cs

现在第三个条目匹配任何列表并将其绑定到,cs但与之前已经捕获的空列表一样,cs将至少有一个元素。

顺便说一句:我认为你不需要这个 - 为什么在返回时抛出错误(使程序崩溃)MaybeyearIn-除了检查它,你也永远不会使用它。

我建议只是

tryGetCityPopulations :: [City] -> Name -> Maybe TotalPop
tryGetCityPopulations cs nameIn = snd <$> lookup nameIn cs

这样,该函数就可以按照名称的含义进行操作,并且您可以继续执行您认为合适的结果。

于 2021-04-24T07:56:46.730 回答