2017-04-23 11 views
4

Swift는 Haskell의 패턴 일치에 사용 된 as-patterns과 비슷한 것을 가지고 있습니까? 내가 중첩 패턴을 사용하여 다음 코드 조각에서 두 번째로 switch 문을 없애려고 : AS-패턴을 사용하여,스위프트의 하스켈과 같은 패턴?

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" 

하스켈 상당이 될 것이다 :

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

동일하지 하스켈과 같은 패턴,하지만 당신은이 같은 중첩 된 패턴으로 제 2 스위치 문을 제거 할 수 있습니다

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 문을 사용하기 때문에 (간접적으로). –