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

时间:2018-01-21 17:29:52

标签: haskell

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

f :: a -> (b,c)
pf :: (a->b,a->c)
f2p :: (a -> (b,c)) -> (a->b,a->c)

我觉得这很难,我想我应该以某种方式使用功能组合,但这个问题似乎很奇怪。我试过的只是为f创建一个虚拟函数。

f n = (n,n+1)

只是为了能够使用其他两个功能。但是当我来写函数pf时,无论我做什么,我都无法让它像defenition想要的那样工作。例如,

pf = (fst a, snd a)
     where a = f 3

这只是把它变成pf ::(Integer,Integer),这不是我想要的。如果我试着用pf ::(Num t)=>强制它(t-> t,t-> t)我得到

  

无法推断使用'f'而产生的(Num(t - > t))

我真的需要一些指导!

1 个答案:

答案 0 :(得分:4)

如果a = f xf :: T -> (B, C),那么a已经是(B, C),而不再是某个功能。我们只收到BC,但我们无法插入另一个T

所以我们需要从f构建两个函数,例如

firstF x  = fst (f x)
secondF x = snd (f x)

实际上,我们已经完成了这一步:

pf = (firstF, secondF)

我们现在可以写f2p

f2p :: (a -> (b,c)) -> (a -> b, a -> c)
f2p f = (fst . f, snd . f)