1

我有以下功能:

function :: [String] -> [[Int]] -> ([[Int]],[[Int]])

我想知道是否有可能做这样的事情:

function :: [String] -> [[Int]] -> ([[Int]],[[Int]])
function a (b:bs) = if condition then ([[]], [b]) ++ function a bs else 
([b], [[]]) ++ function a bs

当然,我可以编写两个返回每个 [[Int]] 的函数,但我想以更适合 Haskell 的方式来完成。

4

3 回答 3

5

元组有一个幺半群实例:

(Monoid a, Monoid b) => Monoid (a, b)

所以 mappend 的结果将是:

([1], [2]) `mappend` ([3], [4])
([1, 3], [2, 4])

所以基本上你只是在你的例子中用 mappend 替换 ++

于 2013-10-30T19:55:31.700 回答
3

怎么用map

import Data.Monoid
f :: t -> [a] -> ([a], [a])
f a = mconcat . map part
  where part b = if True then ([], [b]) else ([b], [])

所以我们让我们part选择我们的元素b将进入哪个列表并让`map,然后mconcat将其展平。

避免显式递归是惯用的haskell,因此您可以通过替换来修复代码mappend++因为您要求使用更合适的haskell方式,我会建议这样做。

哦,你也可以用break

f s = break $ \b -> condition
于 2013-10-30T19:54:44.047 回答
2

最 Haskellic(?) 的方法可能是使用unzip

function a bs = unzip $ function' a bs
    where function' a (b:bs) = (if condition then ([], b) else (b, [])) : function' a bs
          function' _ [] = []  -- You forgot the base case.
于 2013-10-30T19:53:18.673 回答