[英]f x y = 3 + y/x in point free form
我试图找出Haskell中fxy = 3 + y/x
的点自由形式。 我以为这将是f = (3.0+) . flip (/)
f = (3.0+) . flip (/)
,但答案是f2 = curry $ (3.0+) . (uncurry $ flip (/))
f2 = curry $ (3.0+) . (uncurry $ flip (/))
,这与f1 = curry ((3.0+) . (uncurry (flip (/))))
,例如我得到的答案,但在开头翻转和咖喱之前有不接受。
我看到该版本是如何工作的,但我不确定为什么需要curry和uncurry函数,为什么我的版本不起作用? (3.0+)
的类型是a -> a
,如果你通过函数组合使用结果形式flip (/)
来提供该函数,我认为它会起作用,但是(3.0+) . flip (/) 2 10
(3.0+) . flip (/) 2 10
导致错误(为什么?)并且不会产生8.是不是多余的不连续然后再次咖喱?
的类型签名.
是(.) :: (b -> c) -> (a -> b) -> a -> c
。 如您所见,这仅适用于第二个函数(在您的答案flip (/)
)有一个参数 。 如果它有两个参数,我们可以使用“owl运算符” (.) . (.)
(.) . (.)
,其类型:
(.) . (.) :: (b -> c) -> (a -> a1 -> b) -> a -> a1 -> c
或者我们可以使用currying。 通过在flip (/)
部分使用uncurry :: (a -> b -> c) -> (a, b) -> c
,我们构造了一个函数:
uncurry (flip (/)) :: Fractional c => (c, c) -> c
所以现在我们使用单个元组(因此一个参数),然后我们使用curry :: ((a, b) -> c) -> a -> b -> c
再次“解包”生成的第一个参数元组。
如前所述,我们可以使用owl运算符 :
((.) . (.)) (3.0+) (flip (/))
-- ^ owl ^
或者我们可以使用一个语法更复杂的owl运算符版本:
((3 +) .) . flip (/)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.