The Curry-Howard isomorphism simply states that types correspond to sentences, and values correspond to evidence.
Int -> Int does not really mean much interesting, like a logical sentence. When you interpret something as a logical proposition, you are only interested in whether this type is populated (has any meanings) or not. So, Int -> Int just means "given Int , I can give you Int " and that, of course, is true. There are many different proofs (corresponding to various different functions of this type), but taking it as a logical proposition, you don't care.
This does not mean that interesting offers cannot include such functions; it’s just that this particular type is rather boring as a suggestion.
For an instance of a function type that is not completely polymorphic and has a logical meaning, consider p -> Void (for some p), where Void is an unengaged type: a type without values (except for ⊥ in Haskell, but I'll get to that later). The only way to get a value of type Void is if you can prove the contradiction (which, of course, is impossible), and since Void means that you have proved the contradiction, you can get some value from it (i.e. there is an absurd :: Void -> a function absurd :: Void -> a ). Accordingly, p -> Void corresponds to ¬p: this means that "p implies falsehood."
Intuitionistic logic is just a certain logic to which general functional languages correspond. It is important to note that it is constructive: in principle, the proof of a -> b gives you an algorithm for computing b from a , which is not true in ordinary classical logic (due to the law of excluded mean , which will tell you that something is true or false, but not why).
Although functions like Int -> Int don't talk much about sentences, we can make statements about them with other sentences. For example, we can declare an equality type of two types (using GADT ):
data Equal ab where Refl :: Equal aa
If we have a value of type Equal ab , then a is the same type of b : Equal ab corresponds to the sentence a = b. The problem is that we can talk about type equality in this way. But if we had dependent types , we could easily generalize this definition to work with any value, and therefore Equal ab will correspond to the suggestion that the values of a and b are identical. So, for example, we could write:
type IsBijection (f :: a -> b) (g :: b -> a) = forall x. Equal (f (gx)) (g (fx))
Here f and g are regular functions, so f can easily be of type Int -> Int . Again, Haskell cannot do this; you need dependent types to do such things.
Typical functional languages are not very suitable for writing evidence, not only because they do not need dependent types, but also because of ⊥ which, having type a for all a , act as proof of any sentence, but total languages such as Coq and Agda use correspondence to act as evidence systems as well as programming language dependent languages.