Well we know from their definitions that
s k k x = k x (k x) = x
-- s = \f g x -> f x (g x)
-- s k k x = k x (k x)
-- k = \ x y -> x
-- k x y = x
-- k x (k x) = x
so that
s k k = \ x -> x
and thus its type is
a -> a
GHCi concurs (as you've already noted):
> :t s k k
s k k :: t3 -> t3
As to the types in s you ask about,
s :: (t1 -> t2 -> t3) -> (t1 -> t2) -> t1 -> t3
s = \ f g x -> f x (g x)
s f g x = f x (g x)
--
-- x :: t1
-- g :: t1 -> t2
-- g x :: t2
-- x :: t1
-- f :: t1 -> t2 -> t3
-- f x (g x) :: t3
just follow from the most basic rule of type inference in application,
x :: A x :: a
f :: A -> B f :: b -> c
------------------- --------------
f x :: B f x :: c , a ~ b
This is analogous to Modus Ponens in logic, "if we have A, and A implies B, then B holds as well".
If you wanted to get this from the types of s and k a.o.t. their definitions, a similar kind of diagram works for that as well:
s :: (a -> b -> c) -> (a -> b ) -> a -> c
k :: x -> y -> x
------- a~x, b~y, c~x => c~x~a -------------------
s k :: (a -> b ) -> a -> a
k :: x2 -> y2 -> x2
---------------------- a~x2, b~(y2 -> x2) ---------
s k k :: a -> a
(you can see the type you asked about, s k :: (a->b)->a->a, there). Here you can see the type unifications done "step by step" but the two unifications could well have been done together,
s :: (a -> b -> c) -> (a -> b ) -> a -> c
k :: x -> y -> x
k :: x2 -> y2 -> x2
------- a~x, b~y, c~x => c~x~a -------------------
---------------------- a~x2, b~(y2 -> x2) ---------
s k k :: a -> a
The end result is of course the same. Whether we read the above diagram at once or in stages, it's the same diagram. Currying is nice, and it works. And since it works, when you've already applied a thing to two other things you needn't concern yourself with the partial application in stages. Except maybe as a mental exercise.
There's nothing much to say about all these interim types really. You just write them one under the other, being careful to rename the variables consistently at different invocations to avoid capture, noting the resulting equivalences and using them to simplify the resulting types.
Last thing to notice is that s k s and s k (s k) etc. could also be used for the same purpose. Almost, just like ($) is almost the same as id.