当然,在Haskell中,可以通过多种方式生成异构列表的笛卡尔积,例如:
但是我想要的是这样一个函数:
[(x,y) | x <- [1,2,3], y <- [4,5,6]]
或者
(,) <$> [1,2,3] <*> [4,5,6]
但是我想要的是这样一个函数:
heteroCartesian ::
(a1, a2, ... , an) ->
(b1, b2, ... , bn) ->
((a1,b1), (a1,b2), ... , (a1,bn), (a2,b1), (a2,b2), ... , (a2,bn), (an,b1), ... ,(an,b2), ... , (an,bn))
这样我可以做到这样:
f (1,'a',True) (2,'b') ==
((1,2),(1,'b'),('a',2),('a','b'),(True,2),(True,'b'))
我不介意使用元组或其他东西,但我需要保留上面所述的类型信息。
我之所以想要这样做是为了创建测试用例。我有一堆函数和值,例如 n
个函数和 m
个值。最终,我将在这些上映射一个函数,将它们全部归约为相同的类型(一个 Test
),但在此之前,对于我想执行的 n*m
个测试用例,有许多不同类型的值(实际上并不简单,因为某些函数只能取受限制的子集)。
因此,自然而然地,我希望有其他函数可以处理这些异构列表,例如某种 map
。
我已经看过 HList,但它在过去一年多没有更新,而且我也不确定它是否是最合适的工具。