0

我正在尝试创建一个接收列表的函数,应用一个给出布尔值的函数并将列表分成两个列表,创建一个元组。

例如,如果我有单独的表达式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))

空列表和单个列表的前两部分按预期工作,但该函数的真正主体部分无法正常工作。我不确定如何在构建两个不同列表的同时递归地执行表达式。

我也尝试过使用内置的过滤器和地图功能,但没有真正成功。如果有人对如何实现这一点有任何建议,我将不胜感激!

4

1 回答 1

4

您可以使用 hoogle 查找知道其签名的函数。

hoogle (a->Bool) -> [a] -> ([a], [a])partition作为答案之一返回:

Prelude Data.List> partition odd [1,2,3,4,5]
([1,3,5],[2,4])
于 2013-09-29T21:37:11.247 回答