繁体   English   中英

f x y = 3 + y / x,无自由形式

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM