j :: (Ord a) => [(a,a)] -> a -> [a] j xs x = [ v | (u,v) <- xs, u == x]
此代碼根據元組 (x) 的第一個元素顯示 xs 中每個元組的第二個元素的串列。
對于我的任務,我應該根據高階函式映射和/或過濾器來定義它。
我想出了
j xs x = map snd . filter (\(a,_) -> a == x). xs
但是我收到有關型別簽名的錯誤。
你能幫我把它修改成上面提到的型別簽名和任何其他的改變嗎?謝謝
uj5u.com熱心網友回復:
您可以通過使用括號來解決此問題,并洗掉:.之前的最后一個點 ( ) xs:
j :: Eq a => [(a, b)] -> a -> [b]
j xs x = (map snd . filter ((a,_) -> a == x)) xs
在這里,我們因此在括號之間構造了一個函式,并將xs其用作引數。如果您使用f . x,那么由于(.) :: (b -> c) -> (a -> b) -> a -> c,它期望x成為一個函式并構造一個新函式,但在您的情況下xs是一個引數,而不是在“鏈”中使用的另一個函式。
,(a, _) -> a == x可以替換為(x ==) . fst:
j :: Eq a => [(a, b)] -> a -> [b]
j xs x = (map snd . filter ((x ==) . fst)) xs
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/440931.html
標籤:哈斯克尔
