2017-04-23 46 views
4

Swift是否有類似於模式匹配中使用的Haskell's as-patterns?我想用嵌套模式,以擺脫在下面這段代碼的第二switch聲明:Swift中的Haskell-like-patterns?

indirect enum Type: CustomStringConvertible { 
    case Int 
    case Fun(Type, Type) 

    var description: String { 
    switch self { 
     case .Int: return "int" 
     case .Fun(let p, let r): 
     switch p { 
      case .Fun(_): return "(\(p)) -> \(r)" 
      case _: return "\(p) -> \(r)" 
     } 
    } 
    } 
} 

Type.Int        // "int" 
Type.Fun(.Int, .Int)     // "int -> int" 
Type.Fun(Type.Fun(.Int, .Int), .Int) // "(int -> int) -> int" 

Haskell的等效,使用作爲圖案,會是這樣:

data Type = 
    Int 
    | Fun Type Type 

desc :: Type -> String 
desc t = 
    case t of 
    Int -> "int" 
    Fun (p @ (Fun _ _)) r -> "(" ++ desc p ++ ") -> " ++ desc r 
    Fun p r -> desc p ++ " -> " ++ desc r 

回答

1

不一樣的哈斯克爾的模式,但你可以擺脫 第二switch語句與嵌套模式是這樣的:

var description: String { 
    switch self { 
    case .Int: return "int" 
    case .Fun(.Fun(let p, let q), let r): return "(\(Type.Fun(p, q))) -> \(r)" 
    case .Fun(let p, let r): return "\(p) -> \(r)" 
    } 
} 

或REA整理案例:

var description: String { 
    switch self { 
    case .Int: return "int" 
    case .Fun(.Int, let r): return "int -> \(r)" 
    case .Fun(let p, let r): return "(\(p)) -> \(r)" 
    } 
} 
+0

謝謝,但我實際上是希望避免這種情況。 –

+0

不幸的是,第二個版本並沒有做我想做的事情,那就是用parantheses來表示函數類型中的左關聯。最後,我去了這個,它使用'where'子句:https://gist.github.com/igstan/b786d870eb28d7e73dcf5223771db6c4 –

+0

@IonuţG.Stan:我已經考慮過這種方法,但認爲它是「作弊」因爲你仍然使用第二個switch語句(只是間接的)。 –