使用带有2个参数的谓词进行过滤

时间:2018-12-03 14:52:40

标签: algorithm haskell functional-programming

我想要的基本上是列表上的O(n ^ 2)迭代。假设我有一个两个整数的列表,

let list = [2312, 8000, 3456, 7000, 1234]

和一个用于检查两个整数是否相加的函数会产生高于20000的结果(这可以是一个接受两个整数并返回布尔值的任意函数)。

myPredicate :: Int -> Int -> Bool
myPredicate x y = x + y > 10000

是否可以将此谓词应用于上面的列表,以获得包含有效对的列表列表,如下所示:

>> filter myPredicate list
>> [[2312, 8000], [3456, 8000], [3456, 7000], [8000, 7000]]

2 个答案:

答案 0 :(得分:5)

Haskell语法直接支持此功能。

extern crate network_manager;

use network_manager::{
    AccessPoint, AccessPointCredentials, Connection, ConnectionState, Connectivity, Device,
    DeviceType, NetworkManager, Security, ServiceState,
};

fn main() {
    let manager = NetworkManager::new();
    let connections = manager.get_connections().unwrap();
}

这将返回反向和重复的对。如果这不是您所需要的,请考虑以下列表理解:

[(x, y) | x <- myList, y <- myList, x + y > 20000]

如果出于某种科学原因,您有一个包含重复元素的列表,例如[(x, y) | x <- myList, y <- myList, x < y, x + y > 20000] -- no reversed pairs, no repeats [(x, y) | x <- myList, y <- myList, x <= y, x + y > 20000] -- repeats, no reversed pairs ,并且您只希望位于不同位置的元素形成有效对,那么这种简单的列表理解就可以了不行我不知道什么样的现实生活中的问题会要求这样做,但是这里是:

[30000,30000]

(从其他答案中窃取的想法)

答案 1 :(得分:5)

如果我对您的理解正确,那么您想构建对列表,

pairs xs = [(y,z) | (y:ys) <- tails xs, z <- ys]

,然后使用您的谓词将其过滤掉,该谓词必须为非咖喱形式

myPredicate' :: (Int,Int) -> Bool
myPredicate' x y = x + y > 10000

所以

filter myPredicate' (pairs list)

或等效地

filter (uncurry myPredicate) (pairs list)