
Ezequiel Hernan Di Giorgi
Hallo liebe Leute. Hola gente. I'm starting with Haskell and i have some problems:
*intercalate :: [t] -> [t] -> [t]* *intercalate [a,b] [c,d] = [a,c,b,d]* *intercalate (_) (_) = error "JOJO u cant do this"*
Are there any form to restrict the parmaters that only allow to call the function *intercalate* with two arrays of two elements, in compilation time? Cause i cant write* intercalete :: [t,t] -> [t,t]->[t,t,t,t]*.
Yes and no. It's possible, but what you're having is then not a list, because a list has the property that it can hold an arbitrary amount of elements. The simplest way is to use tuples: intercalate :: (a, a) -> (a, a) -> [a] intercalate (a, b) (c, d) = [a, b, c, d] But that function does not look terribly useful to me, so the first question you should ask yourself is: Do you actually want to restrict this to exactly two elements or do you want to restrict it to lists of the same length? If it's the latter it gets more interesting, but is also more involved. Here is a simple way to do it using the GADTs extension: data List :: * -> * -> * where Nil :: List () a Cons :: a -> List n a -> List (Maybe n) a intercalate :: List n a -> List n a -> [a] intercalate (Cons x xs) (Cons y ys) = x : y : intercalate xs ys intercalate Nil Nil = [] As you see what we have here is something that looks like a list and behaves like a list on the value level, but on the type level it's something different, something smarter: Nil :: List () Int Cons 3 Nil :: List (Maybe ()) Int Cons 3 (Cons 4 Nil) :: List (Maybe (Maybe ())) Int Now the length of the list is encoded on the type level and you can match against it. Greets, Ertugrul -- Not to be or to be and (not to be or to be and (not to be or to be and (not to be or to be and ... that is the list monad.