簡體   English   中英

Swift中使用泛型的遞歸枚舉

[英]Recursive Enumerations with Generics in Swift

我是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。

更新
所以我試着將問題壓縮成最小的示例代碼,無法編譯並自己提出問題並提交了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編譯器有更深入了解的人可以對此有所了解,那就太好了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM