Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Explanation why a list with different types is a valid Haskell expression needed

So in an exercise I am given a list like ["xyz", True, 42]. The question was if that is a valid expression in Haskell and what the type of that expression is.

A list can only hold homogenous types but the type of "xyz"is [Char], the type of True is Bool and the type of 42 is Num p => p. That is different types so I can't put them into a list.

That's what I thought. But the given answer to that exercise is "Yes, it is a valid expression. Show-instance!."

Why is it a valid expression although the types of the list elements are different and what is meant with show-instance? I'm thinking of something like superclasses from object oriented languages but I thought this is not how Haskell works.

like image 213
Lyndra Avatar asked Dec 06 '25 13:12

Lyndra


1 Answers

If we are allowed to define some more context, we can make this a valid expression, for instance with:

import Data.String(IsString(fromString))

instance IsString Bool where
    fromString [] = False
    fromString _ = True

instance Num Bool where
    (+) = (||)
    (*) = (&&)
    abs = id
    signum = id
    fromInteger 0 = False
    fromInteger _ = True
    negate = not

(here I used the truthiness of Python to convert from an Integer and String literal)

Then we can write it with the OverloadedStrings pragma:

{-# LANGUAGE OverloadedStrings #-}

the_list = ["xyz", True, 42]

This will then be equivalent to:

Prelude Data.String> ["xyz", True, 42]
[True,True,True]

But note that the list still contains only Bools, we only made Bool an instance of IsString and Num to enable us to convert string literals and number literals to Bools.

A list of heterogeneous types is not possible in Haskell, and since by default a Bool is not a Num, we thus can not parse that expression without adding some extra magic.

An additional note is that it is valid Haskell grammar: syntactically there is nothing wrong, it is only in the next stage of the compiler: type checking, etc. that it will raise errors, since the syntax is nonsensical.

like image 170
Willem Van Onsem Avatar answered Dec 09 '25 19:12

Willem Van Onsem



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!