我想做的是从函数 f 返回一对。我想制作一对两个函数,pf。然后实现 f2p 变换。
\nf :: a -> (b,c)\npf :: (a->b,a->c)\nf2p :: (a -> (b,c)) -> (a->b,a->c)\nRun Code Online (Sandbox Code Playgroud)\n我发现这非常困难,我认为我应该以某种方式使用函数组合,但问题似乎很奇怪。我所尝试的只是为 f 创建一个虚拟函数,如下所示。
\nf n = (n,n+1)\nRun Code Online (Sandbox Code Playgroud)\n只是为了能够与其他两个功能一起工作。但是当我开始编写函数 pf 时,无论我做什么,我都无法使其像定义所希望的那样工作。例如,
\npf = (fst a, snd a)\n where a = f 3\nRun Code Online (Sandbox Code Playgroud)\n这只是将其变成 pf :: (Integer, Integer),这并不是我真正想要的。如果我尝试用 pf :: (Num t) => (t->t,t->t) 强制它,我得到
\n\n\n无法推断出因使用 \xe2\x80\x98f\xe2\x80\x99 而产生的 (Num (t -> t))
\n
我真的需要一些指导!
\n如果a = f x和f :: 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)
| 归档时间: |
|
| 查看次数: |
49 次 |
| 最近记录: |