I appreciate the effort though.
I appreciate the effort though.
The return type is inferred, and the type is what the type class machinery is driven by. You can get some more visibility into that by playing in ghci:
return 0 :: [Int] => [0]
return 0 :: Maybe Int => Just 0
Having behaviour driven by return type takes a bit of getting used to.The 4 things you do with an interface are:
1. Declare an interface
2. Describe the contract of the interface
3. Declare that a datatype (or class) adheres to that interface
4. Provide an implementation of the the contract of the interface (fulfill the contract).
A haskell Typeclass does exactly that. The keyword "class" is where you do #s 1 & 2. The keyword "instance" is where you do #'s 3 & 4.The only notable difference is: If an ISizable has int GetSize() method in haskell instead of the contract being int ISizable.GetSize(), it is static int GetSize(ISizable x).
Or in Haskell:
instance ISizable MyType where
GetSize :: ISizable -> Int -- Note you don't actually type this line
GetSize x = ...
e.g.
return 'c' :: Monad m => m Char
You can actually sort of think of this as a function from typeclass dictionary to value, except the compiler will pass that dictionary itself once it's inferred what it should be (and will then inline/optimize it away, where it can).