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列表的别名,这就解释了他得到的错误。