当然,生成异构列表的笛卡尔积可以在 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
值。最终,我将在这些函数上映射一个函数,将它们全部减少为相同的类型(a Test
),但到目前为止,n*m
我想要执行的测试用例有很多不同的类型(实际上并不是那么简单,因为某些函数只能受限值的子集)。
因此,这些异构列表具有其他功能自然会很好,例如某种功能map
。
我看过HList,但它在去年没有更新,而且我不确定它是否是最合适的工具。