func compose<A,B,C>(f:(B -> C))(g: (A -> B)) -> A -> C { return { f(g(func not(value: Bool) -> Bool { return !value}func even(value: Int) -> Bool { return value % 2 == 0})) }}
这非常有效.例如,如果我没有和isEven函数一样
func odd(value: Int) -> Bool { return compose(not)(isEven)(value)}
奇数函数可以用not来定义,甚至可以这样定义:
infix operator .. { associativity left }func ..<A,C>(f:(B -> C))(g: (A -> B)) -> A -> C { return { f(g(infix operator .. { associativity left }func ..<A,C>(f: (B -> C),g: (A -> B)) -> A -> C { return { f(g()) }}func odd(value: Int) -> Bool { return (not..even)(value)})) }}
然后我决定使用自定义运算符而不是compose函数.自定义 *** 作符是……起初我刚刚复制了compose函数并将其名称更改为…以下是它的样子:
let odd = not..even
这里Xcode给出了错误:“一元运算符实现必须有’前缀’或’后缀’修饰符”
之后我将 *** 作符更改为:
let array = [1,2,3,4]array.map((+1))
奇怪的功能:
prefix func +<A : protocol<IntegerliteralConvertible,IntegerArithmeticType>>(r : A) -> (A -> A) { return { l in l + r }}postfix func +<A : protocol<IntegerliteralConvertible,IntegerArithmeticType>>(l : A) -> (A -> A) { return { r in l + r }}
或者作为封闭:
let l = [Int](1...10) /// [1,4,5,6,7,8,9,10]l.map(+5) /// [6,10,11,12,13,14,15]
这段代码很有效.现在我知道也许这里没有任何好处.. *** 作符在这里讨好,但我想知道为什么不允许咖喱 *** 作符?例如,如果运算符被定义为currIEd函数,我们将做这样的事情:
l.map({ x in x + 5 })解决方法 您需要一些称为运算符部分的东西,或者能够在左侧或右侧部分应用二元运算符.不幸的是,Swift只允许完全没有问题的 *** 作符,这意味着你必须要有一点创意.如果我们将运算符视为二元函数op:(A,A) – > A,然后它的咖喱形式,咖喱 *** 作:A – > A – > A,只是一个返回一元函数的一元函数.我们可以使用分别模拟左右分区的自定义前缀和后缀运算符来伪装它.
这是前缀和后缀
这允许您编写诸如此类的代码
而不是旧的
总结以上是内存溢出为你收集整理的Curried中缀 *** 作符在swift中.可能吗?全部内容,希望文章能够帮你解决Curried中缀 *** 作符在swift中.可能吗?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)