从两个函数创建一个元组变换

Sal*_*ati 0 haskell

我想做的是从函数 f 返回一对。我想制作一对两个函数,pf。然后实现 f2p 变换。

\n
f :: a -> (b,c)\npf :: (a->b,a->c)\nf2p :: (a -> (b,c)) -> (a->b,a->c)\n
Run Code Online (Sandbox Code Playgroud)\n

我发现这非常困难,我认为我应该以某种方式使用函数组合,但问题似乎很奇怪。我所尝试的只是为 f 创建一个虚拟函数,如下所示。

\n
f n = (n,n+1)\n
Run Code Online (Sandbox Code Playgroud)\n

只是为了能够与其他两个功能一起工作。但是当我开始编写函数 pf 时,无论我做什么,我都无法使其像定义所希望的那样工作。例如,

\n
pf = (fst a, snd a)\n     where a = f 3\n
Run Code Online (Sandbox Code Playgroud)\n

这只是将其变成 pf :: (Integer, Integer),这并不是我真正想要的。如果我尝试用 pf :: (Num t) => (t->t,t->t) 强制它,我得到

\n
\n

无法推断出因使用 \xe2\x80\x98f\xe2\x80\x99 而产生的 (Num (t -> t))

\n
\n

我真的需要一些指导!

\n

Zet*_*eta 5

如果a = f xf :: T -> (B, C),那么a已经是一个(B, C)函数,不再是一个函数了。我们只能从中得到一个B或一个,但我们不能插入另一个。CT

所以我们需要构建两个函数f,这样

firstF x  = fst (f x)
secondF x = snd (f x)
Run Code Online (Sandbox Code Playgroud)

事实上,我们已经完成了:

pf = (firstF, secondF)
Run Code Online (Sandbox Code Playgroud)

我们现在可以写f2p

f2p :: (a -> (b,c)) -> (a -> b, a -> c)
f2p f = (fst . f, snd . f)
Run Code Online (Sandbox Code Playgroud)