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
같은
감사합니다.하지만 실제로이를 피하기 위해 노력했습니다. –
불행히도, 두 번째 버전은 내가 원하는 것을하지 않습니다. 이것은 함수 유형에서 왼쪽 연관을 나타 내기 위해 parantheses를 사용하는 것입니다. 마지막으로 나는 where 구문을 사용했다. https://gist.github.com/igstan/b786d870eb28d7e73dcf5223771db6c4 –
@ IonuţG.Stan : 나는 이미 그 접근법에 대해 생각해 왔지만 그것을 "부정 행위"라고 생각했다. 두 번째 switch 문을 사용하기 때문에 (간접적으로). –