0

リストを取り、ブール値を与える関数を適用し、リストを2つのリストに分けて1つのタプルを作成する関数を作成しようとしています。

たとえば、私が別の式を持っていたとし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))

空リストと単一リストの最初の 2 つの部分は期待どおりに機能しますが、関数の実際の大部分は機能しません。式を再帰的に実行すると同時に、2 つの異なるリストを作成する方法がよくわかりません。

組み込みのフィルター機能とマップ機能も試してみましたが、実際には成功しませんでした。これをどのように達成できるかについて誰か提案があれば、私はそれを感謝します!

4

1 に答える 1

4

hoogle を使用して、署名を知っている関数を見つけることができます。

hoogle (a->Bool) -> [a] -> ([a], [a])partition答えの 1 つとして返されます。

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