我快速实施了haskell< *>只要参数是数组,似乎工作的运算符:
public func <*> <T, U>(left:[(T)->U], right:[T]) -> [U] {
return flatten(map(left) { (function) -> [U] in
return map(right) { return function($0) }
})
}
我试图通过将其重写为使用序列而不是数组来使其更加通用,但我在语法上遇到困难,要求序列是一系列函数。这有助于概括正确的参数,但不是左图:
public func <*> <T, U, Tseq:SequenceType where Tseq.Generator.Element == T>(left:[(T)->U], right:Tseq) -> [U] {
return flatten(map(left) { (function) -> [U] in
return map(right) { return function($0) }
})
}
现在我试图概括左侧部分,但遇到语法错误。看起来应该是:
public func <*> <
T,
U,
Tseq:SequenceType where Tseq.Generator.Element == T,
Fseq:SequenceType where Fseq.Generator.Element == (T) -> U
>(left:[(T)->U], right:Tseq) -> [U] {
return flatten(map(left) { (function) -> [U] in
return map(right) { return function($0) }
})
}
但是这给了我一个关于Fseq ...行的错误:
Expected '>' to complete generic parameter list
要求Fseq.Generator.Element是一个取T并返回U的函数的正确语法(或没有正确的语法)是什么?
答案 0 :(得分:1)
一些问题(一个可修复,一个更致命):
您有一般关闭通用模板的语法。所有占位符只有一个where子句,而不是每个占位符的可选子句。所以它更像是:
public func <*> <
T, U, Tseq: SequenceType, Fseq: SequenceType
where Fseq.enerator.Element == T -> U,
Tseq.Generator.Element == T>
(left:[(T)->U], right:Tseq) -> [U] {
return flatten(map(left) { (function) -> [U] in
return map(right) { return function($0) }
})
}
然而,这仍然无效,因为你不能在==
的rhs上使表达式比单个类型更复杂(甚至不是两个占位符的元组)。所以where Fseq.Generator.Element == T->U
不会飞。
你可能想看看swiftz如何做到这一点 - 看起来它需要一个额外的结构。