: T ∈ Γ Γ ⊢ x : T (Var) Γ, x : ⌊S⌋ ⊢ m : T Γ ⊢ ((x:S) => m) : ⌊S⌋ → T (Abs) Γ ⊢ m : S → T Γ ⊢ n : S Γ ⊢ m(n) : T (App) ⌊(x:S) => T⌋ = ⌊S⌋ → ⌊T⌋ (otherwise) ⌊T⌋ = T ڐ͞ΕΔྫ: <A>(f: (a:A) => A) => (n: A) => f(f(n)) f : A → A ∈ {f : A → A, n : A} f : A → A, n : A ⊢ f : A → A f : A → A ∈ {f : A → A, n : A} f : A → A, n : A ⊢ f : A → A n : A ∈ {f : A → A, n : A} f : A → A, n : A ⊢ n : A f : A → A, n : A ⊢ f(n) : A (App) f : A → A, n : A ⊢ f(f(n)) : A (App) f : A → A ⊢ ((n: A) => f(f(n))) : A → A (Abs) ⊢ ((f: (a:A) => A) => (n: A) => f(f(n))) : (A → A) → A → A (Abs)
: T ∈ Γ Γ ⊢ x : T (Var) Γ, x : ⌊S⌋ ⊢ m : T Γ ⊢ ((x:S) => m) : ⌊S⌋ → T (Abs) Γ ⊢ m : S → T Γ ⊢ n : S Γ ⊢ m(n) : T (App) ⌊(x:S) => T⌋ = ⌊S⌋ → ⌊T⌋ (otherwise) ⌊T⌋ = T ڐ͞Εͳ͍ྫ: <A, B>(x: (a:A) => B) => x(x) x : A → B ∈ {x : A → B} x : A → B ⊢ x : A → B (Var) x : A ̸∈ {x : A → B} x : A → B ⊢ x : A (Var) x : A → B ⊢ x(x) : B (App) ⊢ ((x: (a:A) => B) => x(x)) : (A → B) → B (Abs)
A) => f(f(n)) apply2(1, 3) Argument of type ’1’ is not assignable to parame- ter of type ’(a: 3) => 3’ apply2((n) => n*n, 3) // OK let omega = <A, B>(x: (a: A) => B) => x(x) Argument of type ’(a: A) => B’ is not assignable to pa- rameter of type ’A’
(f, n) => f(f(n)) apply2((n) => [n], 3) => [[3]] ܕ͖ͭ let apply2 = <A>(f: (a: A) => A, n: A) => f(f(n)) apply2((n) => [n], 3) Type ’number[]’ is not assignable to type ’number’
ID ͕͋ΔͳΒ, // - ϒοΫϚʔΫͷΤϯςΟςΟ͕͋ΕಘΒΕΔ Seq.sortBy: Seq[A] => (A => B) => Ordering[B] => Seq[A] // - A ͷྻ͕͋Γ, // - A Λ B ʹมͰ͖, // - B ͷॱং͕نఆ͞Ε͍ͯΕ, // - (B ͰιʔτࡁΈͷ)A ͷྻ͕ಘΒΕΔ Either.fold: Either[A, B] => (A => C) => (B => C) => C // - A ·ͨ B ͲͪΒ͔ͷΠϯελϯε͕͋Γ, // - A ͔Β C ͷมͱ, B ͔Β C ͷม͕͋Ε, // - ৗʹ C ͷΠϯελϯε͕ಘΒΕΔ