使用函数组合时出现编译器错误:无法将类型 `([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 -> C
和 g : A -> B
。查看我的用法结构,以下内容变得清晰:
g
在这种情况下是 toChar : String -> [Character]
,所以 A
是 String
而 B
是 [Character]
f
在这种情况下是 myReverse : [Character] -> String
,所以 B
是 [Character]
而 C
是 String
这与上面的类型定义形式相匹配,但是我仍然收到编译器错误。有谁知道我做错了什么?代码是否存在语法问题?
注意,我使用的是 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
我正在使用自定义运算符 >>>
作为建议的函数组合 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 -> C
和 g : A -> B
。查看我的用法结构,以下内容变得清晰:
g
在这种情况下是toChar : String -> [Character]
,所以A
是String
而B
是[Character]
f
在这种情况下是myReverse : [Character] -> String
,所以B
是[Character]
而C
是String
这与上面的类型定义形式相匹配,但是我仍然收到编译器错误。有谁知道我做错了什么?代码是否存在语法问题?
注意,我使用的是 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