On Dec 20, 2007 5:26 PM, Tillmann Rendel
<rendel at rbg.informatik.tu-darmstadt.de> wrote:
> at this point fInit has this type:
> FString -> a -> FString
> > fInit (FString n _) s = FString n (take n s)
> but your implementation has this type
> FString -> String -> FString
> These types are incompatible, your fInit implementation should be able
> to work with whatever type a the caller has choosen to provide. Maybe
That was a very clear explanation of what's wrong, thanks a lot !
> you should try one of
> class Gadget g where
> fInit :: g -> String -> g
This will not do, I want instances of gadget that work with other
values than string.
> or
> class Gadget g a where
> fInit :: g -> a -> g
A bit of explanation.
I want types of class "Gadget" to be able to hold values of some type.
for example, some of the types in the class Gadget would hold strings,
some would hold Integers.
With a variable of a type belonging to the class Gadget, I want to be able to
- Initialise it
- Fetch the value it holds
- Have the user input the value
- Display the value
To keep it simple, in this example I only kept the funtion to initialise.
So it seems I have to use the multiparameter class version, but I'm
stuck here as well :
class Gadget g a where
fInit :: g -> a -> g
data FString = FString !Int !String deriving Show
instance Gadget FString String where
fInit (FString n _) s = FString n (take n s)
fString :: Int -> FString
fString n = FString n ""
----------------------
*Main> :r
[1 of 1] Compiling Main ( Gadget.hs, interpreted )
Ok, modules loaded: Main.
*Main> fString 5 ""
<interactive>:1:0:
Couldn't match expected type `[Char] -> t'
against inferred type `FString'
In the expression: fString 5 ""
In the definition of `it': it = fString 5 ""
*Main>