Haskell &引用;表达式上下文中的模式语法:“uquot;使用地图时

Haskell &引用;表达式上下文中的模式语法:“uquot;使用地图时,haskell,map,tuples,Haskell,Map,Tuples,我有这段代码,它将有条件地更新(或添加)一个元组到元组列表中。我得到了前面提到的错误 updateTuple :: String -> String -> Int -> [Film] -> String updateTuple userName requestedTitle newRating ((Film title _ _ ratings):restOfFilms) | requestedTitle == title = map (\ rating ->

我有这段代码,它将有条件地更新(或添加)一个元组到元组列表中。我得到了前面提到的错误

updateTuple :: String -> String -> Int -> [Film] -> String
updateTuple userName requestedTitle newRating ((Film title _ _ ratings):restOfFilms)
    | requestedTitle == title = map (\ rating -> if rating == (userName,_) then (userName,newRating) else rating) ratings
    | otherwise = updateTuple userName requestedTitle newRating restOfFilms

问题在于此lambda:

\rating -> if rating == (userName,_) then (userName,newRating) else rating
在表达式上下文中使用通配符,这对编译器没有意义,因为通配符只能在模式匹配上下文中使用

我猜你打算做的是:

\rating@(userName', _) -> 
  if userName' == userName then (userName,newRating) else rating

正如@bheklir和@Nikita Volkov所指出的,问题在于:

| requestedTitle == title = map (\ rating -> if rating == (userName,_) then (userName,newRating) else rating) ratings
另一种方法是使用@-语法来分解
评级
变量:

| requestedTitle == title = map (\rating@(ruser,_) -> if ruser == userName then ... else rating)

这条消息非常具有描述性:如果评级==(用户名,)中的
对我和编译器来说都没有意义。因此我不能使用通配符?@user3365968只有在case语句或
BTW中的
=
->
左侧进行模式匹配时,才能在比较中使用通配符,函数的类型签名毫无意义:将评级列表映射到元组列表,而签名表示函数返回一个
字符串
|requestedTitle==title=map(\rating->如果fst rating==userName,那么(userName,newRating)else rating)ratings
我发现一个错误,它想要一个字符@user5402@user5402问题在于,他的函数的类型签名将结果类型定义为
字符串
,而映射结果是元组列表。由于
String
只是
Char
s列表的别名,这就解释了他得到的错误。