Am Freitag, 16. September 2005 16:02 schrieb Adam Wyner:
> [...]
> Suppose I have two expressions:
>> emptyListA = null
>> emptyListB = []
>> emptyListA is apparently a function from empty lists to Bool.
emptyListA is a function from *arbitrary* lists to Bool.
> [...]
> The problem is that there is no "show" function for
> emptyListB, which is just []
>> > emptyListB
>> ERROR - Cannot find "show" function for:
> *** Expression : emptyListB
> *** Of type : [a]
The type [a] means forall a. [a], i.e., you can replace the "a" in [a] with an
arbitrary type t and the expression in question has type [t]. This is only
true for the empty list. [] has type [Integer], [String] etc.
A show function which only accepted empty lists would have type
(forall a. [a]) -> String. This is not possible in Haskell 98. You would
need explicit universal quantification.
What is possible in Haskell is to give show the type [a] -> String. This
means forall a. ([a] -> String), i.e., show has every type [t] -> String
where t is an arbitrary type. This would allow show to be applied to
non-empty lists whose elements itself cannot be shown via the show functions.
This has, of course, to be disallowed. The type [a] -> String is too
general.
The actual type of show in Haskell 98 is Show a => [a] -> String. The element
type has to be an instance of Show which means that its values can be shown
via the show function.
> What I would like, simply is:
> >emptyListB
>> []
You can specialize the type of emptyListB:
input: emptyListB :: [Int]
output: []
> [...]
Best wishes,
Wolfgang