我正在尝试创建一个接收列表的函数,应用一个给出布尔值的函数并将列表分成两个列表,创建一个元组。
例如,如果我有单独的表达式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))
空列表和单个列表的前两部分按预期工作,但该函数的真正主体部分无法正常工作。我不确定如何在构建两个不同列表的同时递归地执行表达式。
我也尝试过使用内置的过滤器和地图功能,但没有真正成功。如果有人对如何实现这一点有任何建议,我将不胜感激!