有没有人知道可以执行以下操作的多态函数?
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)
答案 0 :(得分:4)
不,这真的不可能。
你可以得到的最接近的是写一个类型类,并为每个元组大小提供一个实例,最多63个元组;这实际上就是&#34;任意长度的元组&#34;因为GHC不支持更长的。实际上,在实践中,大多数执行类似操作的库都会将实例定义为7元组左右,并将其称为“#34;实际上任意长度的元组”#34;因为无论如何使用元组的时间太长了。