2016-09-15 35 views
3

所以一直在瞎搞具有部分功能的應用程序即實驗與夫特3操作者的優先級和局部功能應用

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),一切按預期工作

現在,當我試圖讓運營商爲這個斯威夫特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 • : FunctionApplicationPrecedence 

let equals3 = (== • 3)不編譯,並提出了同樣的信息

我在這裏誤解的東西?

回答

2

所以我一直插科打諢與部分功能應用

呀......這大概要去不好......斯威夫特缺乏很多你想使這項工作很好的功能,並穩定地除去了功能(如柯里語法),它甚至有。這是偉大的「你正在與Swift戰鬥」的道路之一,我們都在某個點或另一個點上行走。

這就是說,這有一個簡單的解決方法,與Haskell中的修復無異。你只需要在運營商周圍放置人員,這樣解析器就不會失去主意。 (這可能是值得開JIRA有關診斷你應該得到一個更好的錯誤。)

let equals3 = ((==) • 3) 

或者更簡單地說:

let equals3 = (==) • 3 

但是,哦,斯威夫特會打你,如果你繼續走這路。在所有SIG11s和表情太複雜的情況下,它們全都是玫瑰花,「你的意思是沒有更高級的類型?」

但它是一條有趣的道路,直到你開始扔東西,所以咖喱。

(如果你想看到我的最新步行方式太遠沿着這條道路,這裏的FP in Swift,它... ...工作有點。但是你打了編譯器的整個方式。)