使用高阶函数重写

Rewrite using higher order functions

此代码根据元组的第一个元素 (x) 显示 xs 中每个元组的第二个元素的列表。

对于我的作业,我应该根据高阶函数定义它 map and/or filter。

我想到了

j xs x = map snd . filter (\(a,_) -> a == x). xs

您可以通过使用 parthesis 并删除 xs:

之前的最后一个点 (.) 来解决这个问题
j :: Eq a => [(a, b)] -> a -> [b]
j xs x = <strong>(</strong>map snd . filter ((a,_) -> a == x)<strong>)</strong> 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 (<b>(x ==) . fst</b>)) xs