2014-02-28 34 views
1

我有這樣的代碼,它將有條件地更新(或添加)一個元組到列表中。而我得到上述錯誤「使用映射時表達式上下文中的模式語法:_」使用映射時

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 
+1

該消息是相當具有描述性的:'_' in'if rating ==(userNam e,_)'對我和編譯器都沒有意義。 –

+0

所以我不能使用通配符? – user3365968

+0

@ user3365968只有在case語句中的'='或' - >'的左側模式匹配或綁定中的<-'時,才能在比較中使用通配符。你真正應該做的是'if fst rating == userName then ...' – bheklilr

回答

1

問題是與此拉姆達:

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

您使用表達式上下文中,這是沒有意義的編譯器通配符,因爲通配符只能在模式匹配上下文中使用。

我猜你究竟想要做的是這樣的:

\[email protected](userName', _) -> 
    if userName' == userName then (userName,newRating) else rating 
0

由於@bheklilr和@Nikita沃爾科夫已經注意到,問題就在這裏:

| requestedTitle == title = map (\ rating -> if rating == (userName,_) then (userName,newRating) else rating) ratings 

另一種方法是使用@ - 語法解構rating變量:

+0

'| requestedTitle == title = map(\ rating - > if fst rating == userName then(userName,newRating)else rating)ratings'我得到一個錯誤,它想要一個Char? @ user5402 – user3365968

+0

我錯過了一個'='。現在這個工作嗎? – ErikR

+0

@ user5402問題是他的函數的類型簽名將結果類型定義爲String,而映射結果是元組列表。由於'String'只是'Char'列表的別名,這就解釋了他得到的錯誤。 –