我正在尝试创建一个接收列表的函数,应用一个给出布尔值的函数,并将列表分成两个创建一个元组的列表。
例如,如果我将表达式分开odd [1,2,3,4,5]
。我会得到输出([1,3,5],[2,4])
。
我的代码到目前为止是:
separate:: (a->Bool) -> [a] -> ([a], [a])
separate func [] = ([], [])
separate func [x] = if(func x == True) then ([x], []) else ([], [x])
separate func (x:xs) = if(func x == True) then (x : (fork func xs), []) else ([], x : (fork func xs))
空列表和单个列表的前两个部分按预期工作,但函数的实际部分不起作用。我不确定如何递归执行表达式,同时构建两个不同的列表。
我尝试过使用内置过滤器和地图功能,但没有取得真正的成功。如果有人就如何实现这一点提出建议,我会很感激!
答案 0 :(得分:4)
您可以使用hoogle查找知道其签名的函数。
hoogle (a->Bool) -> [a] -> ([a], [a])
返回partition
作为答案之一:
Prelude Data.List> partition odd [1,2,3,4,5]
([1,3,5],[2,4])