有没有人知道可以做`fn2(_1,_2._2)(3,(4,5))==(3,5)`或类似的多态Haskell函数?

时间:2018-02-24 16:39:17

标签: haskell

有没有人知道可以执行以下操作的多态函数?

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)

1 个答案:

答案 0 :(得分:4)

不,这真的不可能。

你可以得到的最接近的是写一个类型类,并为每个元组大小提供一个实例,最多63个元组;这实际上就是&#34;任意长度的元组&#34;因为GHC不支持更长的。实际上,在实践中,大多数执行类似操作的库都会将实例定义为7元组左右,并将其称为“#34;实际上任意长度的元组”#34;因为无论如何使用元组的时间太长了。