我想要做的是从函数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))
我真的需要一些指导!
答案 0 :(得分:4)
如果a = f x
和f :: T -> (B, C)
,那么a
已经是(B, C)
,而不再是某个功能。我们只收到B
或C
,但我们无法插入另一个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)