,所以我一直在处理部分函数应用程序,即
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中为这个做一个操作员时,事情变得不那么酷了
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
所以我想,好吧,也许是因为这两个运算符==和•相邻而没有声明任何优先规则(尽管在这种情况下==不应该被认为是操作符)
但是,仍然
precedencegroup FunctionApplicationPrecedence {
higherThan: ComparisonPrecedence // the precedencegroup == belongs to
}
infix operator • : FunctionApplicationPrecedencelet equals3 = (== • 3)不编译并引发相同的消息
我是不是误会了什么?
发布于 2016-09-15 02:21:12
所以我一直在处理部分函数应用程序
是啊,…这可能会很糟糕,…Swift缺乏很多你想让它工作得很好的特性,并且已经稳步地删除了它所拥有的特性(比如当前语法)。这是一条伟大的“你在与斯威夫特战斗”的道路之一,我们都在这样或那样的地方走下去。
也就是说,这是一个简单的解决方法,与Haskell中的修复没有什么不同。您只需在操作符周围放置parens,这样解析器就不会失去理智。(可能值得打开一个关于诊断的JIRA。你应该得到一个更好的错误。)
let equals3 = ((==) • 3)或者更简单地说:
let equals3 = (==) • 3但是如果你继续走这条路斯威夫特会和你决斗的。这一切都是玫瑰,直到所有的SIG11s和表达过于复杂和“你的意思是没有更高的类型?”
但这是一条有趣的路,直到你开始扔东西,所以继续。
(如果你想看我最近一次走得太远的话,请看Swift中FP。它..。起作用..。有点像。但是你一直在和编译器斗争。)
https://stackoverflow.com/questions/39501853
复制相似问题