// 12. 표준 라이브러리 시그니처가 실제로 검사된다 // // std가 생기기 전에는 List.each가 모르는 이름이라 조용히 통과했다. // "모르는 것을 틀렸다고 말하지 않는다"는 맞는 원칙이지만, 그 그늘에 // 검사되지 않는 영역이 숨어 있었다. 이제 그늘이 없다. // // 이 파일은 세 가지 오류를 낸다. import "cool.dev/std/list" as List import "cool.dev/std/int" as Int pub capability Console { fn print(s: String) effects {Console.print} } // (1) effect 다형성. e는 클로저의 시그니처에서 {Console.print}로 묶이고, // 그것이 이 함수의 effects 절 {}를 넘는다. effect 변수가 호출 지점에서 // 실제로 해소된다는 증거다 — 이게 안 걸리면 규칙이 장식이다. pub fn leaks_effect(c: Console, xs: List[Int]) { List.each(xs, fn(n) { c.print(Int.show(n)) }) } // (2) 인자 개수 pub fn wrong_arity(xs: List[Int]) -> Int { List.len(xs, 1) } // (3) 반환 타입 pub fn wrong_type(xs: List[Int]) -> String { List.len(xs) }