使用高阶函数重写
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
此代码根据元组的第一个元素 (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