首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift 3算子优先实验及部分函数应用

Swift 3算子优先实验及部分函数应用
EN

Stack Overflow用户
提问于 2016-09-15 01:16:29
回答 1查看 202关注 0票数 3

,所以我一直在处理部分函数应用程序,即

代码语言:javascript
复制
func partial<A, B, C>(_ @escaping f: (A, B) -> C, _ a: A) -> (_ b: B) -> C {
    return { b in f(a, b) }
}

这很酷。我可以做let equals3 = partial(==, 3),一切都像预期的那样工作

现在,当我试图在Swift 3中为这个做一个操作员时,事情变得不那么酷了

代码语言:javascript
复制
infix operator •
func • <A, B, C>(_ @escaping lhs: (A, B) -> C, _ rhs: A) -> (_ b: B) -> C {
    return { b in lhs(rhs, b) }
}

let equals3 = (== • 3)引发编译器消息Unary operator cannot be separated from it's operand

所以我想,好吧,也许是因为这两个运算符==相邻而没有声明任何优先规则(尽管在这种情况下==不应该被认为是操作符)

但是,仍然

代码语言:javascript
复制
precedencegroup FunctionApplicationPrecedence {
    higherThan: ComparisonPrecedence // the precedencegroup == belongs to
}
infix operator • : FunctionApplicationPrecedence

let equals3 = (== • 3)不编译并引发相同的消息

我是不是误会了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-15 02:21:12

所以我一直在处理部分函数应用程序

是啊,…这可能会很糟糕,…Swift缺乏很多你想让它工作得很好的特性,并且已经稳步地删除了它所拥有的特性(比如当前语法)。这是一条伟大的“你在与斯威夫特战斗”的道路之一,我们都在这样或那样的地方走下去。

也就是说,这是一个简单的解决方法,与Haskell中的修复没有什么不同。您只需在操作符周围放置parens,这样解析器就不会失去理智。(可能值得打开一个关于诊断的JIRA。你应该得到一个更好的错误。)

代码语言:javascript
复制
let equals3 = ((==) • 3)

或者更简单地说:

代码语言:javascript
复制
let equals3 = (==) • 3

但是如果你继续走这条路斯威夫特会和你决斗的。这一切都是玫瑰,直到所有的SIG11s和表达过于复杂和“你的意思是没有更高的类型?”

但这是一条有趣的路,直到你开始扔东西,所以继续。

(如果你想看我最近一次走得太远的话,请看Swift中FP。它..。起作用..。有点像。但是你一直在和编译器斗争。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39501853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档