有人知道可以执行以下的多态函数吗?
fn :: (a -> b, a -> c) -> a -> (b, c)
fn :: (a -> b, a -> c, a -> d) -> a -> (b, c, d)
-- etc, supporting arbitrary length tuples.
我知道我可以做
((,,) <$> foo <*> bar <*> qux) baz
(liftA3 (,,) foo bar qux) baz
我想知道我是否也可以做
fn (foo, bar) baz
fn (foo, bar, qux) baz
如果答案依赖于lens
软件包,则可以。
,如果这样做,也许可以进一步允许以下一步:
fn2 (_1, _2._2) (3, (4, 5)) == (3, 5)
不,这是不可能的。
您可以获得的最接近的是写一个类型,并为每个元组的大小提供一个实例。实际上,这是"任意长度元组",因为GHC不支持更长的元素。实际上,实际上,大多数做类似事情的库定义了最多7个左右的实例,并将其称为"实际上是任意长度的元素",因为无论如何,使用元素的使用寿命很少。