使用函数组合时出现编译器错误:无法将类型 `([Character]) -> String` 的值转换为预期的 > 参数类型 `_ -> _`

Compiler error when using function composition: Cannot convert value of type `([Character]) -> String` to expected > argument type `_ -> _`

我正在使用自定义运算符 >>> 作为建议的函数组合 here

我定义了以下内容:

infix operator >>> { associativity left }
func >>> <A, B, C>(f: B -> C, g: A -> B) -> (A -> C) {
    return { x in f(g(x)) }
}

func toChars(s: String) -> [Character] {
    return s.characters.reduce([]) { (acc, c) in acc + [c] }
}

func myReverse(xs: [Character]) -> String {
    if let (head, tail) = xs.decompose {
        return String(myReverse(tail)) + String(head)
    }
    return ""
}

现在,当我想像这样将这两个函数放在一起时:

func reverseString(s: String) -> String {
    return myReverse >>> toChars
}

我收到编译器错误:

Cannot convert value of type ([Character]) -> String to expected argument type _ -> _.

根据我的理解,这应该可行。 >>> 被定义为采用两个函数 f : B -> Cg : A -> B。查看我的用法结构,以下内容变得清晰:

这与上面的类型定义形式相匹配,但是我仍然收到编译器错误。有谁知道我做错了什么?代码是否存在语法问题?

注意,我使用的是 Array 扩展,其中函数 decompose 的定义如下:

var decompose : (head: Element, tail: [Element])? {
    if count > 0 {
        return (self[0], Array(self[1..<count]))
    }
    return nil
}

myReverse >>> toChars returns 类型为 String -> String 闭包 , 您仍然必须使用字符串参数调用闭包:

func reverseString(s: String) -> String {
    return (myReverse >>> toChars)(s)
}

但您可能想要的是:

let reverseString = myReverse >>> toChars

在这两种情况下,reverseString 的类型都是 String -> String, 所以你可以称它为

print(reverseString("foo"))
// oof