gpt4 book ai didi

swift - Swift 中泛型的递归枚举

转载 作者:搜寻专家 更新时间:2023-10-31 08:06:17 24 4
gpt4 key购买 nike

我是 Swift 的新手。我试图用递归枚举和泛型实现二叉树:

enum BinaryTree<T> {
indirect case Node(T, BinaryTree<T>, BinaryTree<T>)
case Nothing
}

func inorder<T>(_ root: BinaryTree<T>) -> [T] {
switch root {
case .Nothing:
return []
case let .Node(val, left, right):
return inorder(left) + [val] + inorder(right)
}
}

这是我得到的错误:

$ swift ADT.swift 
ADT.swift:83:20: error: cannot convert value of type 'BinaryTree<T>' to expected argument type 'BinaryTree<_>'
return inorder(left) + [val] + inorder(right)
^~~~

但是,这是可行的:

func inorder<T>(_ root: BinaryTree<T>) -> [T] {
switch root {
case .Nothing:
return []
case let .Node(val, left, right):
let l = inorder(left)
let r = inorder(right)
return l + [val] + r
}
}

我的语法有错误吗?谢谢!

我正在使用 Swift 3.0。

最佳答案

更新
所以我试图将问题浓缩为无法编译的最小示例代码和asked a question我自己并提交了SR-4304 .事实证明,这确实是编译器中的错误。

原始答案
据我所知,您的语法完全有效。似乎 Swift 编译器的类型推断似乎需要朝着正确的方向轻推,而您的第二个解决方案显然提供了这一点。由于我过去遇到过几个类似的问题,尤其是关于 + 运算符,你的问题激发了我尝试其他几种连接数组的方法。这些都有效(我只是展示了最后三种情况的返回语句和支持函数):

return (inorder(left) as [T]) + [val] + inorder(right)
return Array([inorder(left), [val], inorder(right)].joined())
return [inorder(left), [val], inorder(right)].reduce([], +)
return [inorder(left), [val], inorder(right)].flatMap { $0 }

func myjoin1<T>(_ arrays: [T]...) -> [T]
{
return arrays.reduce([], +)
}
return myjoin1(inorder(left), [val], inorder(right))

func myjoin2<T>(_ array1: [T], _ array2: [T], _ array3: [T]) -> [T]
{
return array1 + array2 + array3
}
return myjoin2(inorder(left), [val], inorder(right))

extension Array
{
func appending(_ array: [Element]) -> [Element]
{
return self + array
}
}
return inorder(left).appending([val]).appending(inorder(right))

将运算符作为函数调用也会编译:

return (+)(inorder(left), [val]) + inorder(right)

如果对 Swift 编译器有更深入了解的人可以对此有所说明,那就太好了。

关于swift - Swift 中泛型的递归枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39813486/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com